| // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB |
| /* Copyright (c) 2022, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */ |
| |
| #include <linux/debugfs.h> |
| #include <linux/mlx5/fs.h> |
| #include "mlx5_vnet.h" |
| |
| static int tirn_show(struct seq_file *file, void *priv) |
| { |
| struct mlx5_vdpa_net *ndev = file->private; |
| |
| seq_printf(file, "0x%x\n", ndev->res.tirn); |
| return 0; |
| } |
| |
| DEFINE_SHOW_ATTRIBUTE(tirn); |
| |
| void mlx5_vdpa_remove_tirn(struct mlx5_vdpa_net *ndev) |
| { |
| if (ndev->debugfs) |
| debugfs_remove(ndev->res.tirn_dent); |
| } |
| |
| void mlx5_vdpa_add_tirn(struct mlx5_vdpa_net *ndev) |
| { |
| ndev->res.tirn_dent = debugfs_create_file("tirn", 0444, ndev->rx_dent, |
| ndev, &tirn_fops); |
| } |
| |
| static int rx_flow_table_show(struct seq_file *file, void *priv) |
| { |
| struct mlx5_vdpa_net *ndev = file->private; |
| |
| seq_printf(file, "0x%x\n", mlx5_flow_table_id(ndev->rxft)); |
| return 0; |
| } |
| |
| DEFINE_SHOW_ATTRIBUTE(rx_flow_table); |
| |
| void mlx5_vdpa_remove_rx_flow_table(struct mlx5_vdpa_net *ndev) |
| { |
| if (ndev->debugfs) |
| debugfs_remove(ndev->rx_table_dent); |
| } |
| |
| void mlx5_vdpa_add_rx_flow_table(struct mlx5_vdpa_net *ndev) |
| { |
| ndev->rx_table_dent = debugfs_create_file("table_id", 0444, ndev->rx_dent, |
| ndev, &rx_flow_table_fops); |
| } |
| |
| #if defined(CONFIG_MLX5_VDPA_STEERING_DEBUG) |
| static int packets_show(struct seq_file *file, void *priv) |
| { |
| struct mlx5_vdpa_counter *counter = file->private; |
| u64 packets; |
| u64 bytes; |
| int err; |
| |
| err = mlx5_fc_query(counter->mdev, counter->counter, &packets, &bytes); |
| if (err) |
| return err; |
| |
| seq_printf(file, "0x%llx\n", packets); |
| return 0; |
| } |
| |
| static int bytes_show(struct seq_file *file, void *priv) |
| { |
| struct mlx5_vdpa_counter *counter = file->private; |
| u64 packets; |
| u64 bytes; |
| int err; |
| |
| err = mlx5_fc_query(counter->mdev, counter->counter, &packets, &bytes); |
| if (err) |
| return err; |
| |
| seq_printf(file, "0x%llx\n", bytes); |
| return 0; |
| } |
| |
| DEFINE_SHOW_ATTRIBUTE(packets); |
| DEFINE_SHOW_ATTRIBUTE(bytes); |
| |
| static void add_counter_node(struct mlx5_vdpa_counter *counter, |
| struct dentry *parent) |
| { |
| debugfs_create_file("packets", 0444, parent, counter, |
| &packets_fops); |
| debugfs_create_file("bytes", 0444, parent, counter, |
| &bytes_fops); |
| } |
| |
| void mlx5_vdpa_add_rx_counters(struct mlx5_vdpa_net *ndev, |
| struct macvlan_node *node) |
| { |
| static const char *ut = "untagged"; |
| char vidstr[9]; |
| u16 vid; |
| |
| node->ucast_counter.mdev = ndev->mvdev.mdev; |
| node->mcast_counter.mdev = ndev->mvdev.mdev; |
| if (node->tagged) { |
| vid = key2vid(node->macvlan); |
| snprintf(vidstr, sizeof(vidstr), "0x%x", vid); |
| } else { |
| strcpy(vidstr, ut); |
| } |
| |
| node->dent = debugfs_create_dir(vidstr, ndev->rx_dent); |
| if (IS_ERR(node->dent)) { |
| node->dent = NULL; |
| return; |
| } |
| |
| node->ucast_counter.dent = debugfs_create_dir("ucast", node->dent); |
| if (IS_ERR(node->ucast_counter.dent)) |
| return; |
| |
| add_counter_node(&node->ucast_counter, node->ucast_counter.dent); |
| |
| node->mcast_counter.dent = debugfs_create_dir("mcast", node->dent); |
| if (IS_ERR(node->mcast_counter.dent)) |
| return; |
| |
| add_counter_node(&node->mcast_counter, node->mcast_counter.dent); |
| } |
| |
| void mlx5_vdpa_remove_rx_counters(struct mlx5_vdpa_net *ndev, |
| struct macvlan_node *node) |
| { |
| if (node->dent && ndev->debugfs) |
| debugfs_remove_recursive(node->dent); |
| } |
| #endif |
| |
| void mlx5_vdpa_add_debugfs(struct mlx5_vdpa_net *ndev) |
| { |
| struct mlx5_core_dev *mdev; |
| |
| mdev = ndev->mvdev.mdev; |
| ndev->debugfs = debugfs_create_dir(dev_name(&ndev->mvdev.vdev.dev), |
| mlx5_debugfs_get_dev_root(mdev)); |
| if (!IS_ERR(ndev->debugfs)) |
| ndev->rx_dent = debugfs_create_dir("rx", ndev->debugfs); |
| } |
| |
| void mlx5_vdpa_remove_debugfs(struct mlx5_vdpa_net *ndev) |
| { |
| debugfs_remove_recursive(ndev->debugfs); |
| ndev->debugfs = NULL; |
| } |