/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
/* Copyright (c) 2021, Mellanox Technologies inc. All rights reserved. */

#ifndef __MLX5_EN_TIR_H__
#define __MLX5_EN_TIR_H__

#include <linux/kernel.h>

struct mlx5e_rss_params_hash {
	u8 hfunc;
	u8 toeplitz_hash_key[40];
};

struct mlx5e_rss_params_traffic_type {
	u8 l3_prot_type;
	u8 l4_prot_type;
	u32 rx_hash_fields;
};

struct mlx5e_tir_builder;
struct mlx5e_packet_merge_param;

struct mlx5e_tir_builder *mlx5e_tir_builder_alloc(bool modify);
void mlx5e_tir_builder_free(struct mlx5e_tir_builder *builder);
void mlx5e_tir_builder_clear(struct mlx5e_tir_builder *builder);

void mlx5e_tir_builder_build_inline(struct mlx5e_tir_builder *builder, u32 tdn, u32 rqn);
void mlx5e_tir_builder_build_rqt(struct mlx5e_tir_builder *builder, u32 tdn,
				 u32 rqtn, bool inner_ft_support);
void mlx5e_tir_builder_build_packet_merge(struct mlx5e_tir_builder *builder,
					  const struct mlx5e_packet_merge_param *pkt_merge_param);
void mlx5e_tir_builder_build_rss(struct mlx5e_tir_builder *builder,
				 const struct mlx5e_rss_params_hash *rss_hash,
				 const struct mlx5e_rss_params_traffic_type *rss_tt,
				 bool inner);
void mlx5e_tir_builder_build_direct(struct mlx5e_tir_builder *builder);
void mlx5e_tir_builder_build_tls(struct mlx5e_tir_builder *builder);

struct mlx5_core_dev;

struct mlx5e_tir {
	struct mlx5_core_dev *mdev;
	u32 tirn;
	struct list_head list;
};

int mlx5e_tir_init(struct mlx5e_tir *tir, struct mlx5e_tir_builder *builder,
		   struct mlx5_core_dev *mdev, bool reg);
void mlx5e_tir_destroy(struct mlx5e_tir *tir);

static inline u32 mlx5e_tir_get_tirn(struct mlx5e_tir *tir)
{
	return tir->tirn;
}

int mlx5e_tir_modify(struct mlx5e_tir *tir, struct mlx5e_tir_builder *builder);

#endif /* __MLX5_EN_TIR_H__ */
