1 | /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ |
2 | /* Copyright (c) 2020 Mellanox Technologies. */ |
3 | |
4 | #ifndef __ML5_ESW_CHAINS_H__ |
5 | #define __ML5_ESW_CHAINS_H__ |
6 | |
7 | #include <linux/mlx5/fs.h> |
8 | |
9 | struct mlx5_fs_chains; |
10 | struct mlx5_mapped_obj; |
11 | |
12 | enum mlx5_chains_flags { |
13 | MLX5_CHAINS_AND_PRIOS_SUPPORTED = BIT(0), |
14 | MLX5_CHAINS_IGNORE_FLOW_LEVEL_SUPPORTED = BIT(1), |
15 | MLX5_CHAINS_FT_TUNNEL_SUPPORTED = BIT(2), |
16 | }; |
17 | |
18 | struct mlx5_chains_attr { |
19 | enum mlx5_flow_namespace_type ns; |
20 | int fs_base_prio; |
21 | int fs_base_level; |
22 | u32 flags; |
23 | u32 max_grp_num; |
24 | struct mlx5_flow_table *default_ft; |
25 | struct mapping_ctx *mapping; |
26 | }; |
27 | |
28 | #if IS_ENABLED(CONFIG_MLX5_CLS_ACT) |
29 | |
30 | bool |
31 | mlx5_chains_prios_supported(struct mlx5_fs_chains *chains); |
32 | bool mlx5_chains_ignore_flow_level_supported(struct mlx5_fs_chains *chains); |
33 | bool |
34 | mlx5_chains_backwards_supported(struct mlx5_fs_chains *chains); |
35 | u32 |
36 | mlx5_chains_get_prio_range(struct mlx5_fs_chains *chains); |
37 | u32 |
38 | mlx5_chains_get_chain_range(struct mlx5_fs_chains *chains); |
39 | u32 |
40 | mlx5_chains_get_nf_ft_chain(struct mlx5_fs_chains *chains); |
41 | |
42 | struct mlx5_flow_table * |
43 | mlx5_chains_get_table(struct mlx5_fs_chains *chains, u32 chain, u32 prio, |
44 | u32 level); |
45 | void |
46 | mlx5_chains_put_table(struct mlx5_fs_chains *chains, u32 chain, u32 prio, |
47 | u32 level); |
48 | |
49 | struct mlx5_flow_table * |
50 | mlx5_chains_get_tc_end_ft(struct mlx5_fs_chains *chains); |
51 | |
52 | struct mlx5_flow_table * |
53 | mlx5_chains_create_global_table(struct mlx5_fs_chains *chains); |
54 | void |
55 | mlx5_chains_destroy_global_table(struct mlx5_fs_chains *chains, |
56 | struct mlx5_flow_table *ft); |
57 | |
58 | int |
59 | mlx5_chains_get_chain_mapping(struct mlx5_fs_chains *chains, u32 chain, |
60 | u32 *chain_mapping); |
61 | int |
62 | mlx5_chains_put_chain_mapping(struct mlx5_fs_chains *chains, |
63 | u32 chain_mapping); |
64 | |
65 | struct mlx5_fs_chains * |
66 | mlx5_chains_create(struct mlx5_core_dev *dev, struct mlx5_chains_attr *attr); |
67 | void mlx5_chains_destroy(struct mlx5_fs_chains *chains); |
68 | |
69 | void |
70 | mlx5_chains_set_end_ft(struct mlx5_fs_chains *chains, |
71 | struct mlx5_flow_table *ft); |
72 | void |
73 | mlx5_chains_print_info(struct mlx5_fs_chains *chains); |
74 | |
75 | #else /* CONFIG_MLX5_CLS_ACT */ |
76 | |
77 | static inline bool |
78 | mlx5_chains_ignore_flow_level_supported(struct mlx5_fs_chains *chains) |
79 | { return false; } |
80 | |
81 | static inline struct mlx5_flow_table * |
82 | mlx5_chains_get_table(struct mlx5_fs_chains *chains, u32 chain, u32 prio, |
83 | u32 level) { return ERR_PTR(-EOPNOTSUPP); } |
84 | static inline void |
85 | mlx5_chains_put_table(struct mlx5_fs_chains *chains, u32 chain, u32 prio, |
86 | u32 level) {}; |
87 | |
88 | static inline struct mlx5_flow_table * |
89 | mlx5_chains_get_tc_end_ft(struct mlx5_fs_chains *chains) { return ERR_PTR(-EOPNOTSUPP); } |
90 | |
91 | static inline struct mlx5_fs_chains * |
92 | mlx5_chains_create(struct mlx5_core_dev *dev, struct mlx5_chains_attr *attr) |
93 | { return NULL; } |
94 | static inline void |
95 | mlx5_chains_destroy(struct mlx5_fs_chains *chains) {} |
96 | static inline void |
97 | mlx5_chains_print_info(struct mlx5_fs_chains *chains) {} |
98 | |
99 | #endif /* CONFIG_MLX5_CLS_ACT */ |
100 | |
101 | #endif /* __ML5_ESW_CHAINS_H__ */ |
102 | |