1 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2 /* Copyright (c) 2024 NVIDIA Corporation & Affiliates */ 3 4 #ifndef MLX5HWS_RULE_H_ 5 #define MLX5HWS_RULE_H_ 6 7 enum { 8 MLX5HWS_STE_CTRL_SZ = 20, 9 MLX5HWS_ACTIONS_SZ = 12, 10 MLX5HWS_MATCH_TAG_SZ = 32, 11 MLX5HWS_JUMBO_TAG_SZ = 44, 12 }; 13 14 enum mlx5hws_rule_status { 15 MLX5HWS_RULE_STATUS_UNKNOWN, 16 MLX5HWS_RULE_STATUS_CREATING, 17 MLX5HWS_RULE_STATUS_CREATED, 18 MLX5HWS_RULE_STATUS_UPDATING, 19 MLX5HWS_RULE_STATUS_UPDATED, 20 MLX5HWS_RULE_STATUS_DELETING, 21 MLX5HWS_RULE_STATUS_DELETED, 22 MLX5HWS_RULE_STATUS_FAILING, 23 MLX5HWS_RULE_STATUS_FAILED, 24 }; 25 26 enum mlx5hws_rule_move_state { 27 MLX5HWS_RULE_RESIZE_STATE_IDLE, 28 MLX5HWS_RULE_RESIZE_STATE_WRITING, 29 MLX5HWS_RULE_RESIZE_STATE_DELETING, 30 }; 31 32 enum mlx5hws_rule_jumbo_match_tag_offset { 33 MLX5HWS_RULE_JUMBO_MATCH_TAG_OFFSET_DW0 = 8, 34 }; 35 36 struct mlx5hws_rule_match_tag { 37 union { 38 u8 jumbo[MLX5HWS_JUMBO_TAG_SZ]; 39 struct { 40 u8 reserved[MLX5HWS_ACTIONS_SZ]; 41 u8 match[MLX5HWS_MATCH_TAG_SZ]; 42 }; 43 }; 44 }; 45 46 struct mlx5hws_rule_action_ste_info { 47 struct mlx5hws_pool *pool; 48 int index; /* STE array index */ 49 u8 num_stes; 50 }; 51 52 struct mlx5hws_rule_resize_info { 53 u32 rtc_0; 54 u32 rtc_1; 55 u32 rule_idx; 56 u8 state; 57 u8 ctrl_seg[MLX5HWS_WQE_SZ_GTA_CTRL]; /* Ctrl segment of STE: 48 bytes */ 58 u8 data_seg[MLX5HWS_WQE_SZ_GTA_DATA]; /* Data segment of STE: 64 bytes */ 59 }; 60 61 struct mlx5hws_rule { 62 struct mlx5hws_matcher *matcher; 63 union { 64 struct mlx5hws_rule_match_tag tag; 65 struct mlx5hws_rule_resize_info *resize_info; 66 }; 67 struct mlx5hws_rule_action_ste_info action_ste; 68 struct mlx5hws_rule_action_ste_info old_action_ste; 69 u32 rtc_0; /* The RTC into which the STE was inserted */ 70 u32 rtc_1; /* The RTC into which the STE was inserted */ 71 u8 status; /* enum mlx5hws_rule_status */ 72 u8 pending_wqes; 73 bool skip_delete; /* For complex rules - another rule with same tag 74 * still exists, so don't actually delete this rule. 75 */ 76 }; 77 78 void mlx5hws_rule_free_action_ste(struct mlx5hws_rule_action_ste_info *action_ste); 79 80 int mlx5hws_rule_move_hws_remove(struct mlx5hws_rule *rule, 81 void *queue, void *user_data); 82 83 int mlx5hws_rule_move_hws_add(struct mlx5hws_rule *rule, 84 struct mlx5hws_rule_attr *attr); 85 86 bool mlx5hws_rule_move_in_progress(struct mlx5hws_rule *rule); 87 88 void mlx5hws_rule_clear_resize_info(struct mlx5hws_rule *rule); 89 90 #endif /* MLX5HWS_RULE_H_ */ 91