13f22d6c7SMaxim Mikityanskiy /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
23f22d6c7SMaxim Mikityanskiy /* Copyright (c) 2021, Mellanox Technologies inc. All rights reserved. */
33f22d6c7SMaxim Mikityanskiy 
43f22d6c7SMaxim Mikityanskiy #ifndef __MLX5_EN_RX_RES_H__
53f22d6c7SMaxim Mikityanskiy #define __MLX5_EN_RX_RES_H__
63f22d6c7SMaxim Mikityanskiy 
73f22d6c7SMaxim Mikityanskiy #include <linux/kernel.h>
83f22d6c7SMaxim Mikityanskiy #include "rqt.h"
9a6696735SMaxim Mikityanskiy #include "tir.h"
103f22d6c7SMaxim Mikityanskiy #include "fs.h"
1125307a91STariq Toukan #include "rss.h"
123f22d6c7SMaxim Mikityanskiy 
1343ec0f41SMaxim Mikityanskiy struct mlx5e_rx_res;
143f22d6c7SMaxim Mikityanskiy 
1543ec0f41SMaxim Mikityanskiy struct mlx5e_channels;
1643ec0f41SMaxim Mikityanskiy struct mlx5e_rss_params_hash;
170570c1c9SMaxim Mikityanskiy 
1843ec0f41SMaxim Mikityanskiy enum mlx5e_rx_res_features {
1943ec0f41SMaxim Mikityanskiy 	MLX5E_RX_RES_FEATURE_INNER_FT = BIT(0),
203db4c85cSMaxim Mikityanskiy 	MLX5E_RX_RES_FEATURE_PTP = BIT(1),
213f22d6c7SMaxim Mikityanskiy };
223f22d6c7SMaxim Mikityanskiy 
2343ec0f41SMaxim Mikityanskiy /* Setup */
2443ec0f41SMaxim Mikityanskiy struct mlx5e_rx_res *mlx5e_rx_res_alloc(void);
2543ec0f41SMaxim Mikityanskiy int mlx5e_rx_res_init(struct mlx5e_rx_res *res, struct mlx5_core_dev *mdev,
2643ec0f41SMaxim Mikityanskiy 		      enum mlx5e_rx_res_features features, unsigned int max_nch,
27eaee12f0SKhalid Manaa 		      u32 drop_rqn, const struct mlx5e_packet_merge_param *init_pkt_merge_param,
2843ec0f41SMaxim Mikityanskiy 		      unsigned int init_nch);
2943ec0f41SMaxim Mikityanskiy void mlx5e_rx_res_destroy(struct mlx5e_rx_res *res);
3043ec0f41SMaxim Mikityanskiy void mlx5e_rx_res_free(struct mlx5e_rx_res *res);
3143ec0f41SMaxim Mikityanskiy 
3243ec0f41SMaxim Mikityanskiy /* TIRN getters for flow steering */
3343ec0f41SMaxim Mikityanskiy u32 mlx5e_rx_res_get_tirn_direct(struct mlx5e_rx_res *res, unsigned int ix);
34d443c6f6SMaor Gottlieb u32 mlx5e_rx_res_get_tirn_rss(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
35d443c6f6SMaor Gottlieb u32 mlx5e_rx_res_get_tirn_rss_inner(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
3643ec0f41SMaxim Mikityanskiy u32 mlx5e_rx_res_get_tirn_ptp(struct mlx5e_rx_res *res);
3743ec0f41SMaxim Mikityanskiy 
3843ec0f41SMaxim Mikityanskiy /* Activate/deactivate API */
3943ec0f41SMaxim Mikityanskiy void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_channels *chs);
4043ec0f41SMaxim Mikityanskiy void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res);
413db4c85cSMaxim Mikityanskiy void mlx5e_rx_res_xsk_update(struct mlx5e_rx_res *res, struct mlx5e_channels *chs,
423db4c85cSMaxim Mikityanskiy 			     unsigned int ix, bool xsk);
4343ec0f41SMaxim Mikityanskiy 
4443ec0f41SMaxim Mikityanskiy /* Configuration API */
4543ec0f41SMaxim Mikityanskiy void mlx5e_rx_res_rss_set_indir_uniform(struct mlx5e_rx_res *res, unsigned int nch);
46f01cc58cSTariq Toukan int mlx5e_rx_res_rss_get_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
47f01cc58cSTariq Toukan 			      u32 *indir, u8 *key, u8 *hfunc);
48f01cc58cSTariq Toukan int mlx5e_rx_res_rss_set_rxfh(struct mlx5e_rx_res *res, u32 rss_idx,
49f01cc58cSTariq Toukan 			      const u32 *indir, const u8 *key, const u8 *hfunc);
50f01cc58cSTariq Toukan 
51*0212e5d9SJoe Damato int mlx5e_rx_res_rss_get_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
52*0212e5d9SJoe Damato 				     enum mlx5_traffic_types tt);
53*0212e5d9SJoe Damato int mlx5e_rx_res_rss_set_hash_fields(struct mlx5e_rx_res *res, u32 rss_idx,
54*0212e5d9SJoe Damato 				     enum mlx5_traffic_types tt, u8 rx_hash_fields);
55eaee12f0SKhalid Manaa int mlx5e_rx_res_packet_merge_set_param(struct mlx5e_rx_res *res,
56eaee12f0SKhalid Manaa 					struct mlx5e_packet_merge_param *pkt_merge_param);
5743ec0f41SMaxim Mikityanskiy 
58f01cc58cSTariq Toukan int mlx5e_rx_res_rss_init(struct mlx5e_rx_res *res, u32 *rss_idx, unsigned int init_nch);
59f01cc58cSTariq Toukan int mlx5e_rx_res_rss_destroy(struct mlx5e_rx_res *res, u32 rss_idx);
60f01cc58cSTariq Toukan int mlx5e_rx_res_rss_cnt(struct mlx5e_rx_res *res);
61248d3b4cSTariq Toukan int mlx5e_rx_res_rss_index(struct mlx5e_rx_res *res, struct mlx5e_rss *rss);
62248d3b4cSTariq Toukan struct mlx5e_rss *mlx5e_rx_res_rss_get(struct mlx5e_rx_res *res, u32 rss_idx);
63f01cc58cSTariq Toukan 
6443ec0f41SMaxim Mikityanskiy /* Workaround for hairpin */
6543ec0f41SMaxim Mikityanskiy struct mlx5e_rss_params_hash mlx5e_rx_res_get_current_hash(struct mlx5e_rx_res *res);
6665d6b6e5SMaxim Mikityanskiy 
674cce2ccfSTariq Toukan /* Accel TIRs */
684cce2ccfSTariq Toukan int mlx5e_rx_res_tls_tir_create(struct mlx5e_rx_res *res, unsigned int rxq,
694cce2ccfSTariq Toukan 				struct mlx5e_tir *tir);
703f22d6c7SMaxim Mikityanskiy #endif /* __MLX5_EN_RX_RES_H__ */
71