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#include <linux/debugfs.h>
562306a36Sopenharmony_ci#include <linux/mlx5/fs.h>
662306a36Sopenharmony_ci#include "mlx5_vnet.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistatic int tirn_show(struct seq_file *file, void *priv)
962306a36Sopenharmony_ci{
1062306a36Sopenharmony_ci	struct mlx5_vdpa_net *ndev = file->private;
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci	seq_printf(file, "0x%x\n", ndev->res.tirn);
1362306a36Sopenharmony_ci	return 0;
1462306a36Sopenharmony_ci}
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(tirn);
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_civoid mlx5_vdpa_remove_tirn(struct mlx5_vdpa_net *ndev)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	if (ndev->debugfs)
2162306a36Sopenharmony_ci		debugfs_remove(ndev->res.tirn_dent);
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_civoid mlx5_vdpa_add_tirn(struct mlx5_vdpa_net *ndev)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	ndev->res.tirn_dent = debugfs_create_file("tirn", 0444, ndev->rx_dent,
2762306a36Sopenharmony_ci						  ndev, &tirn_fops);
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic int rx_flow_table_show(struct seq_file *file, void *priv)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	struct mlx5_vdpa_net *ndev = file->private;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	seq_printf(file, "0x%x\n", mlx5_flow_table_id(ndev->rxft));
3562306a36Sopenharmony_ci	return 0;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(rx_flow_table);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_civoid mlx5_vdpa_remove_rx_flow_table(struct mlx5_vdpa_net *ndev)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	if (ndev->debugfs)
4362306a36Sopenharmony_ci		debugfs_remove(ndev->rx_table_dent);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_civoid mlx5_vdpa_add_rx_flow_table(struct mlx5_vdpa_net *ndev)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	ndev->rx_table_dent = debugfs_create_file("table_id", 0444, ndev->rx_dent,
4962306a36Sopenharmony_ci						  ndev, &rx_flow_table_fops);
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG)
5362306a36Sopenharmony_cistatic int packets_show(struct seq_file *file, void *priv)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	struct mlx5_vdpa_counter *counter = file->private;
5662306a36Sopenharmony_ci	u64 packets;
5762306a36Sopenharmony_ci	u64 bytes;
5862306a36Sopenharmony_ci	int err;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	err = mlx5_fc_query(counter->mdev, counter->counter, &packets, &bytes);
6162306a36Sopenharmony_ci	if (err)
6262306a36Sopenharmony_ci		return err;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	seq_printf(file, "0x%llx\n", packets);
6562306a36Sopenharmony_ci	return 0;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic int bytes_show(struct seq_file *file, void *priv)
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	struct mlx5_vdpa_counter *counter = file->private;
7162306a36Sopenharmony_ci	u64 packets;
7262306a36Sopenharmony_ci	u64 bytes;
7362306a36Sopenharmony_ci	int err;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	err = mlx5_fc_query(counter->mdev, counter->counter, &packets, &bytes);
7662306a36Sopenharmony_ci	if (err)
7762306a36Sopenharmony_ci		return err;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	seq_printf(file, "0x%llx\n", bytes);
8062306a36Sopenharmony_ci	return 0;
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(packets);
8462306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(bytes);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic void add_counter_node(struct mlx5_vdpa_counter *counter,
8762306a36Sopenharmony_ci			     struct dentry *parent)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	debugfs_create_file("packets", 0444, parent, counter,
9062306a36Sopenharmony_ci			    &packets_fops);
9162306a36Sopenharmony_ci	debugfs_create_file("bytes", 0444, parent, counter,
9262306a36Sopenharmony_ci			    &bytes_fops);
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_civoid mlx5_vdpa_add_rx_counters(struct mlx5_vdpa_net *ndev,
9662306a36Sopenharmony_ci			       struct macvlan_node *node)
9762306a36Sopenharmony_ci{
9862306a36Sopenharmony_ci	static const char *ut = "untagged";
9962306a36Sopenharmony_ci	char vidstr[9];
10062306a36Sopenharmony_ci	u16 vid;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	node->ucast_counter.mdev = ndev->mvdev.mdev;
10362306a36Sopenharmony_ci	node->mcast_counter.mdev = ndev->mvdev.mdev;
10462306a36Sopenharmony_ci	if (node->tagged) {
10562306a36Sopenharmony_ci		vid = key2vid(node->macvlan);
10662306a36Sopenharmony_ci		snprintf(vidstr, sizeof(vidstr), "0x%x", vid);
10762306a36Sopenharmony_ci	} else {
10862306a36Sopenharmony_ci		strcpy(vidstr, ut);
10962306a36Sopenharmony_ci	}
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	node->dent = debugfs_create_dir(vidstr, ndev->rx_dent);
11262306a36Sopenharmony_ci	if (IS_ERR(node->dent)) {
11362306a36Sopenharmony_ci		node->dent = NULL;
11462306a36Sopenharmony_ci		return;
11562306a36Sopenharmony_ci	}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	node->ucast_counter.dent = debugfs_create_dir("ucast", node->dent);
11862306a36Sopenharmony_ci	if (IS_ERR(node->ucast_counter.dent))
11962306a36Sopenharmony_ci		return;
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	add_counter_node(&node->ucast_counter, node->ucast_counter.dent);
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	node->mcast_counter.dent = debugfs_create_dir("mcast", node->dent);
12462306a36Sopenharmony_ci	if (IS_ERR(node->mcast_counter.dent))
12562306a36Sopenharmony_ci		return;
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	add_counter_node(&node->mcast_counter, node->mcast_counter.dent);
12862306a36Sopenharmony_ci}
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_civoid mlx5_vdpa_remove_rx_counters(struct mlx5_vdpa_net *ndev,
13162306a36Sopenharmony_ci				  struct macvlan_node *node)
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	if (node->dent && ndev->debugfs)
13462306a36Sopenharmony_ci		debugfs_remove_recursive(node->dent);
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci#endif
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_civoid mlx5_vdpa_add_debugfs(struct mlx5_vdpa_net *ndev)
13962306a36Sopenharmony_ci{
14062306a36Sopenharmony_ci	struct mlx5_core_dev *mdev;
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	mdev = ndev->mvdev.mdev;
14362306a36Sopenharmony_ci	ndev->debugfs = debugfs_create_dir(dev_name(&ndev->mvdev.vdev.dev),
14462306a36Sopenharmony_ci					   mlx5_debugfs_get_dev_root(mdev));
14562306a36Sopenharmony_ci	if (!IS_ERR(ndev->debugfs))
14662306a36Sopenharmony_ci		ndev->rx_dent = debugfs_create_dir("rx", ndev->debugfs);
14762306a36Sopenharmony_ci}
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_civoid mlx5_vdpa_remove_debugfs(struct mlx5_vdpa_net *ndev)
15062306a36Sopenharmony_ci{
15162306a36Sopenharmony_ci	debugfs_remove_recursive(ndev->debugfs);
15262306a36Sopenharmony_ci	ndev->debugfs = NULL;
15362306a36Sopenharmony_ci}
154