xref: /dpdk/drivers/net/mlx5/hws/mlx5dr_rule.h (revision c54d3949bcb34d22236ee9cdd684b967f6049867)
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