xref: /linux/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/rule.h (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
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