162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
262306a36Sopenharmony_ci/* Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __MLX5_VNET_H__
562306a36Sopenharmony_ci#define __MLX5_VNET_H__
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include "mlx5_vdpa.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define to_mlx5_vdpa_ndev(__mvdev)                                             \
1062306a36Sopenharmony_ci	container_of(__mvdev, struct mlx5_vdpa_net, mvdev)
1162306a36Sopenharmony_ci#define to_mvdev(__vdev) container_of((__vdev), struct mlx5_vdpa_dev, vdev)
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct mlx5_vdpa_net_resources {
1462306a36Sopenharmony_ci	u32 tisn;
1562306a36Sopenharmony_ci	u32 tdn;
1662306a36Sopenharmony_ci	u32 tirn;
1762306a36Sopenharmony_ci	u32 rqtn;
1862306a36Sopenharmony_ci	bool valid;
1962306a36Sopenharmony_ci	struct dentry *tirn_dent;
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define MLX5V_MACVLAN_SIZE 256
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline u16 key2vid(u64 key)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return (u16)(key >> 48) & 0xfff;
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define MLX5_VDPA_IRQ_NAME_LEN 32
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistruct mlx5_vdpa_irq_pool_entry {
3262306a36Sopenharmony_ci	struct msi_map map;
3362306a36Sopenharmony_ci	bool used;
3462306a36Sopenharmony_ci	char name[MLX5_VDPA_IRQ_NAME_LEN];
3562306a36Sopenharmony_ci	void *dev_id;
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct mlx5_vdpa_irq_pool {
3962306a36Sopenharmony_ci	int num_ent;
4062306a36Sopenharmony_ci	struct mlx5_vdpa_irq_pool_entry *entries;
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct mlx5_vdpa_net {
4462306a36Sopenharmony_ci	struct mlx5_vdpa_dev mvdev;
4562306a36Sopenharmony_ci	struct mlx5_vdpa_net_resources res;
4662306a36Sopenharmony_ci	struct virtio_net_config config;
4762306a36Sopenharmony_ci	struct mlx5_vdpa_virtqueue *vqs;
4862306a36Sopenharmony_ci	struct vdpa_callback *event_cbs;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	/* Serialize vq resources creation and destruction. This is required
5162306a36Sopenharmony_ci	 * since memory map might change and we need to destroy and create
5262306a36Sopenharmony_ci	 * resources while driver in operational.
5362306a36Sopenharmony_ci	 */
5462306a36Sopenharmony_ci	struct rw_semaphore reslock;
5562306a36Sopenharmony_ci	struct mlx5_flow_table *rxft;
5662306a36Sopenharmony_ci	struct dentry *rx_dent;
5762306a36Sopenharmony_ci	struct dentry *rx_table_dent;
5862306a36Sopenharmony_ci	bool setup;
5962306a36Sopenharmony_ci	u32 cur_num_vqs;
6062306a36Sopenharmony_ci	u32 rqt_size;
6162306a36Sopenharmony_ci	bool nb_registered;
6262306a36Sopenharmony_ci	struct notifier_block nb;
6362306a36Sopenharmony_ci	struct vdpa_callback config_cb;
6462306a36Sopenharmony_ci	struct mlx5_vdpa_wq_ent cvq_ent;
6562306a36Sopenharmony_ci	struct hlist_head macvlan_hash[MLX5V_MACVLAN_SIZE];
6662306a36Sopenharmony_ci	struct mlx5_vdpa_irq_pool irqp;
6762306a36Sopenharmony_ci	struct dentry *debugfs;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	u32 umem_1_buffer_param_a;
7062306a36Sopenharmony_ci	u32 umem_1_buffer_param_b;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	u32 umem_2_buffer_param_a;
7362306a36Sopenharmony_ci	u32 umem_2_buffer_param_b;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	u32 umem_3_buffer_param_a;
7662306a36Sopenharmony_ci	u32 umem_3_buffer_param_b;
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cistruct mlx5_vdpa_counter {
8062306a36Sopenharmony_ci	struct mlx5_fc *counter;
8162306a36Sopenharmony_ci	struct dentry *dent;
8262306a36Sopenharmony_ci	struct mlx5_core_dev *mdev;
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistruct macvlan_node {
8662306a36Sopenharmony_ci	struct hlist_node hlist;
8762306a36Sopenharmony_ci	struct mlx5_flow_handle *ucast_rule;
8862306a36Sopenharmony_ci	struct mlx5_flow_handle *mcast_rule;
8962306a36Sopenharmony_ci	u64 macvlan;
9062306a36Sopenharmony_ci	struct mlx5_vdpa_net *ndev;
9162306a36Sopenharmony_ci	bool tagged;
9262306a36Sopenharmony_ci#if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
9362306a36Sopenharmony_ci	struct dentry *dent;
9462306a36Sopenharmony_ci	struct mlx5_vdpa_counter ucast_counter;
9562306a36Sopenharmony_ci	struct mlx5_vdpa_counter mcast_counter;
9662306a36Sopenharmony_ci#endif
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_civoid mlx5_vdpa_add_debugfs(struct mlx5_vdpa_net *ndev);
10062306a36Sopenharmony_civoid mlx5_vdpa_remove_debugfs(struct mlx5_vdpa_net *ndev);
10162306a36Sopenharmony_civoid mlx5_vdpa_add_rx_flow_table(struct mlx5_vdpa_net *ndev);
10262306a36Sopenharmony_civoid mlx5_vdpa_remove_rx_flow_table(struct mlx5_vdpa_net *ndev);
10362306a36Sopenharmony_civoid mlx5_vdpa_add_tirn(struct mlx5_vdpa_net *ndev);
10462306a36Sopenharmony_civoid mlx5_vdpa_remove_tirn(struct mlx5_vdpa_net *ndev);
10562306a36Sopenharmony_ci#if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
10662306a36Sopenharmony_civoid mlx5_vdpa_add_rx_counters(struct mlx5_vdpa_net *ndev,
10762306a36Sopenharmony_ci			       struct macvlan_node *node);
10862306a36Sopenharmony_civoid mlx5_vdpa_remove_rx_counters(struct mlx5_vdpa_net *ndev,
10962306a36Sopenharmony_ci				  struct macvlan_node *node);
11062306a36Sopenharmony_ci#else
11162306a36Sopenharmony_cistatic inline void mlx5_vdpa_add_rx_counters(struct mlx5_vdpa_net *ndev,
11262306a36Sopenharmony_ci					     struct macvlan_node *node) {}
11362306a36Sopenharmony_cistatic inline void mlx5_vdpa_remove_rx_counters(struct mlx5_vdpa_net *ndev,
11462306a36Sopenharmony_ci						struct macvlan_node *node) {}
11562306a36Sopenharmony_ci#endif
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci#endif /* __MLX5_VNET_H__ */
119