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_resize_info { 47 u32 rtc_0; 48 u32 rtc_1; 49 u32 rule_idx; 50 u8 state; 51 u8 ctrl_seg[MLX5HWS_WQE_SZ_GTA_CTRL]; /* Ctrl segment of STE: 48 bytes */ 52 u8 data_seg[MLX5HWS_WQE_SZ_GTA_DATA]; /* Data segment of STE: 64 bytes */ 53 }; 54 55 struct mlx5hws_rule { 56 struct mlx5hws_matcher *matcher; 57 union { 58 struct mlx5hws_rule_match_tag tag; 59 struct mlx5hws_rule_resize_info *resize_info; 60 }; 61 struct mlx5hws_action_ste_chunk action_ste; 62 struct mlx5hws_action_ste_chunk old_action_ste; 63 u32 rtc_0; /* The RTC into which the STE was inserted */ 64 u32 rtc_1; /* The RTC into which the STE was inserted */ 65 u8 status; /* enum mlx5hws_rule_status */ 66 u8 pending_wqes; 67 bool skip_delete; /* For complex rules - another rule with same tag 68 * still exists, so don't actually delete this rule. 69 */ 70 }; 71 72 void mlx5hws_rule_skip(struct mlx5hws_matcher *matcher, u32 flow_source, 73 bool *skip_rx, bool *skip_tx); 74 75 void mlx5hws_rule_free_action_ste(struct mlx5hws_action_ste_chunk *action_ste); 76 77 int mlx5hws_rule_move_hws_remove(struct mlx5hws_rule *rule, 78 void *queue, void *user_data); 79 80 int mlx5hws_rule_move_hws_add(struct mlx5hws_rule *rule, 81 struct mlx5hws_rule_attr *attr); 82 83 bool mlx5hws_rule_move_in_progress(struct mlx5hws_rule *rule); 84 85 void mlx5hws_rule_clear_resize_info(struct mlx5hws_rule *rule); 86 87 #endif /* MLX5HWS_RULE_H_ */ 88