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