net: hibmcge: Add debugfs supported in this module

This patch initializes debugfs and creates root directory
for each device. The tx_ring and rx_ring debugfs files
are implemented together.

Signed-off-by: Jijie Shao <shaojijie@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20241216040532.1566229-2-shaojijie@huawei.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jijie Shao
2024-12-16 12:05:26 +08:00
committed by Jakub Kicinski
parent 95dcfdff8b
commit 86331b5102
4 changed files with 135 additions and 3 deletions

View File

@@ -5,4 +5,5 @@
obj-$(CONFIG_HIBMCGE) += hibmcge.o
hibmcge-objs = hbg_main.o hbg_hw.o hbg_mdio.o hbg_irq.o hbg_txrx.o hbg_ethtool.o
hibmcge-objs = hbg_main.o hbg_hw.o hbg_mdio.o hbg_irq.o hbg_txrx.o hbg_ethtool.o \
hbg_debugfs.o

View File

@@ -0,0 +1,94 @@
// SPDX-License-Identifier: GPL-2.0+
// Copyright (c) 2024 Hisilicon Limited.
#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/etherdevice.h>
#include <linux/seq_file.h>
#include <linux/string_choices.h>
#include "hbg_common.h"
#include "hbg_debugfs.h"
#include "hbg_hw.h"
#include "hbg_irq.h"
#include "hbg_txrx.h"
static struct dentry *hbg_dbgfs_root;
struct hbg_dbg_info {
const char *name;
int (*read)(struct seq_file *seq, void *data);
};
static void hbg_dbg_ring(struct hbg_priv *priv, struct hbg_ring *ring,
struct seq_file *s)
{
u32 irq_mask = ring->dir == HBG_DIR_TX ? HBG_INT_MSK_TX_B :
HBG_INT_MSK_RX_B;
seq_printf(s, "ring used num: %u\n",
hbg_get_queue_used_num(ring));
seq_printf(s, "ring max num: %u\n", ring->len);
seq_printf(s, "ring head: %u, tail: %u\n", ring->head, ring->tail);
seq_printf(s, "fifo used num: %u\n",
hbg_hw_get_fifo_used_num(priv, ring->dir));
seq_printf(s, "fifo max num: %u\n",
hbg_get_spec_fifo_max_num(priv, ring->dir));
seq_printf(s, "irq enabled: %s\n",
str_true_false(hbg_hw_irq_is_enabled(priv, irq_mask)));
}
static int hbg_dbg_tx_ring(struct seq_file *s, void *unused)
{
struct net_device *netdev = dev_get_drvdata(s->private);
struct hbg_priv *priv = netdev_priv(netdev);
hbg_dbg_ring(priv, &priv->tx_ring, s);
return 0;
}
static int hbg_dbg_rx_ring(struct seq_file *s, void *unused)
{
struct net_device *netdev = dev_get_drvdata(s->private);
struct hbg_priv *priv = netdev_priv(netdev);
hbg_dbg_ring(priv, &priv->rx_ring, s);
return 0;
}
static const struct hbg_dbg_info hbg_dbg_infos[] = {
{ "tx_ring", hbg_dbg_tx_ring },
{ "rx_ring", hbg_dbg_rx_ring },
};
static void hbg_debugfs_uninit(void *data)
{
debugfs_remove_recursive((struct dentry *)data);
}
void hbg_debugfs_init(struct hbg_priv *priv)
{
const char *name = pci_name(priv->pdev);
struct device *dev = &priv->pdev->dev;
struct dentry *root;
u32 i;
root = debugfs_create_dir(name, hbg_dbgfs_root);
for (i = 0; i < ARRAY_SIZE(hbg_dbg_infos); i++)
debugfs_create_devm_seqfile(dev, hbg_dbg_infos[i].name,
root, hbg_dbg_infos[i].read);
/* Ignore the failure because debugfs is not a key feature. */
devm_add_action_or_reset(dev, hbg_debugfs_uninit, root);
}
void hbg_debugfs_register(void)
{
hbg_dbgfs_root = debugfs_create_dir("hibmcge", NULL);
}
void hbg_debugfs_unregister(void)
{
debugfs_remove_recursive(hbg_dbgfs_root);
hbg_dbgfs_root = NULL;
}

View File

@@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/* Copyright (c) 2024 Hisilicon Limited. */
#ifndef __HBG_DEBUGFS_H
#define __HBG_DEBUGFS_H
void hbg_debugfs_register(void);
void hbg_debugfs_unregister(void);
void hbg_debugfs_init(struct hbg_priv *priv);
#endif

View File

@@ -11,6 +11,7 @@
#include "hbg_irq.h"
#include "hbg_mdio.h"
#include "hbg_txrx.h"
#include "hbg_debugfs.h"
static void hbg_change_mtu(struct hbg_priv *priv, int new_mtu);
@@ -160,7 +161,12 @@ static int hbg_init(struct hbg_priv *priv)
if (ret)
return ret;
return hbg_mdio_init(priv);
ret = hbg_mdio_init(priv);
if (ret)
return ret;
hbg_debugfs_init(priv);
return 0;
}
static int hbg_pci_init(struct pci_dev *pdev)
@@ -245,7 +251,26 @@ static struct pci_driver hbg_driver = {
.id_table = hbg_pci_tbl,
.probe = hbg_probe,
};
module_pci_driver(hbg_driver);
static int __init hbg_module_init(void)
{
int ret;
hbg_debugfs_register();
ret = pci_register_driver(&hbg_driver);
if (ret)
hbg_debugfs_unregister();
return ret;
}
module_init(hbg_module_init);
static void __exit hbg_module_exit(void)
{
pci_unregister_driver(&hbg_driver);
hbg_debugfs_unregister();
}
module_exit(hbg_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Huawei Tech. Co., Ltd.");