1405242c5SAlex Vesker /* SPDX-License-Identifier: BSD-3-Clause 2405242c5SAlex Vesker * Copyright (c) 2022 NVIDIA Corporation & Affiliates 3405242c5SAlex Vesker */ 4405242c5SAlex Vesker 5405242c5SAlex Vesker #ifndef MLX5DR_RULE_H_ 6405242c5SAlex Vesker #define MLX5DR_RULE_H_ 7405242c5SAlex Vesker 8405242c5SAlex Vesker enum { 9405242c5SAlex Vesker MLX5DR_STE_CTRL_SZ = 20, 10405242c5SAlex Vesker MLX5DR_ACTIONS_SZ = 12, 11405242c5SAlex Vesker MLX5DR_MATCH_TAG_SZ = 32, 12405242c5SAlex Vesker MLX5DR_JUMBO_TAG_SZ = 44, 13405242c5SAlex Vesker }; 14405242c5SAlex Vesker 15405242c5SAlex Vesker enum mlx5dr_rule_status { 16405242c5SAlex Vesker MLX5DR_RULE_STATUS_UNKNOWN, 17405242c5SAlex Vesker MLX5DR_RULE_STATUS_CREATING, 18405242c5SAlex Vesker MLX5DR_RULE_STATUS_CREATED, 19405242c5SAlex Vesker MLX5DR_RULE_STATUS_DELETING, 20405242c5SAlex Vesker MLX5DR_RULE_STATUS_DELETED, 21405242c5SAlex Vesker MLX5DR_RULE_STATUS_FAILING, 22405242c5SAlex Vesker MLX5DR_RULE_STATUS_FAILED, 23405242c5SAlex Vesker }; 24405242c5SAlex Vesker 25762fecebSYevgeny Kliteynik enum mlx5dr_rule_move_state { 26762fecebSYevgeny Kliteynik MLX5DR_RULE_RESIZE_STATE_IDLE, 27762fecebSYevgeny Kliteynik MLX5DR_RULE_RESIZE_STATE_WRITING, 28762fecebSYevgeny Kliteynik MLX5DR_RULE_RESIZE_STATE_DELETING, 29762fecebSYevgeny Kliteynik }; 30762fecebSYevgeny Kliteynik 31405242c5SAlex Vesker struct mlx5dr_rule_match_tag { 32405242c5SAlex Vesker union { 33405242c5SAlex Vesker uint8_t jumbo[MLX5DR_JUMBO_TAG_SZ]; 34405242c5SAlex Vesker struct { 35405242c5SAlex Vesker uint8_t reserved[MLX5DR_ACTIONS_SZ]; 36405242c5SAlex Vesker uint8_t match[MLX5DR_MATCH_TAG_SZ]; 37405242c5SAlex Vesker }; 38405242c5SAlex Vesker }; 39405242c5SAlex Vesker }; 40405242c5SAlex Vesker 41762fecebSYevgeny Kliteynik struct mlx5dr_rule_resize_info { 4254ffdbb7SYevgeny Kliteynik struct mlx5dr_pool *action_ste_pool; 43762fecebSYevgeny Kliteynik uint32_t rtc_0; 44762fecebSYevgeny Kliteynik uint32_t rtc_1; 45762fecebSYevgeny Kliteynik uint32_t rule_idx; 4654ffdbb7SYevgeny Kliteynik uint8_t state; 47*c54d3949SYevgeny Kliteynik uint8_t max_stes; 48762fecebSYevgeny Kliteynik uint8_t ctrl_seg[MLX5DR_WQE_SZ_GTA_CTRL]; /* Ctrl segment of STE: 48 bytes */ 49762fecebSYevgeny Kliteynik uint8_t data_seg[MLX5DR_WQE_SZ_GTA_DATA]; /* Data segment of STE: 64 bytes */ 50762fecebSYevgeny Kliteynik }; 51762fecebSYevgeny Kliteynik 52405242c5SAlex Vesker struct mlx5dr_rule { 53405242c5SAlex Vesker struct mlx5dr_matcher *matcher; 54405242c5SAlex Vesker union { 55405242c5SAlex Vesker struct mlx5dr_rule_match_tag tag; 56348cdeecSAlex Vesker /* Pointer to tag to store more than one tag */ 57348cdeecSAlex Vesker struct mlx5dr_rule_match_tag *tag_ptr; 58405242c5SAlex Vesker struct ibv_flow *flow; 59762fecebSYevgeny Kliteynik struct mlx5dr_rule_resize_info *resize_info; 60405242c5SAlex Vesker }; 61405242c5SAlex Vesker uint32_t rtc_0; /* The RTC into which the STE was inserted */ 62405242c5SAlex Vesker uint32_t rtc_1; /* The RTC into which the STE was inserted */ 6338b5bf64SYevgeny Kliteynik int action_ste_idx; /* STE array index */ 64405242c5SAlex Vesker uint8_t status; /* enum mlx5dr_rule_status */ 65405242c5SAlex Vesker uint8_t pending_wqes; 66405242c5SAlex Vesker }; 67405242c5SAlex Vesker 68405242c5SAlex Vesker void mlx5dr_rule_free_action_ste_idx(struct mlx5dr_rule *rule); 69405242c5SAlex Vesker 70762fecebSYevgeny Kliteynik int mlx5dr_rule_move_hws_remove(struct mlx5dr_rule *rule, 71762fecebSYevgeny Kliteynik void *queue, void *user_data); 72762fecebSYevgeny Kliteynik 73762fecebSYevgeny Kliteynik int mlx5dr_rule_move_hws_add(struct mlx5dr_rule *rule, 74762fecebSYevgeny Kliteynik struct mlx5dr_rule_attr *attr); 75762fecebSYevgeny Kliteynik 7668b34daaSYevgeny Kliteynik bool mlx5dr_rule_move_in_progress(struct mlx5dr_rule *rule); 77762fecebSYevgeny Kliteynik 78*c54d3949SYevgeny Kliteynik void mlx5dr_rule_clear_resize_info(struct mlx5dr_rule *rule); 79*c54d3949SYevgeny Kliteynik 80fcee5d78SYevgeny Kliteynik int mlx5dr_rule_create_root_no_comp(struct mlx5dr_rule *rule, 81fcee5d78SYevgeny Kliteynik const struct rte_flow_item items[], 82fcee5d78SYevgeny Kliteynik uint8_t num_actions, 83fcee5d78SYevgeny Kliteynik struct mlx5dr_rule_action rule_actions[]); 84fcee5d78SYevgeny Kliteynik 85fcee5d78SYevgeny Kliteynik int mlx5dr_rule_destroy_root_no_comp(struct mlx5dr_rule *rule); 86fcee5d78SYevgeny Kliteynik 87405242c5SAlex Vesker #endif /* MLX5DR_RULE_H_ */ 88