dmaengine Archive on lore.kernel.org
 help / color / Atom feed
* [PATCH v4 0/2] dmaengine: Initial debugfs support
@ 2020-02-28 13:07 Peter Ujfalusi
  2020-02-28 13:07 ` [PATCH v4 1/2] dmaengine: Add basic " Peter Ujfalusi
  2020-02-28 13:07 ` [PATCH v4 2/2] dmaengine: ti: k3-udma: Implement custom dbg_summary_show for debugfs Peter Ujfalusi
  0 siblings, 2 replies; 7+ messages in thread
From: Peter Ujfalusi @ 2020-02-28 13:07 UTC (permalink / raw)
  To: vkoul; +Cc: dmaengine, linux-kernel, dan.j.williams, geert

Hi,

Changes since v3:
- Create a directory for dmaengine and name the initial file as summary
- Function to get the debugfs root for DMA drivers if they want to place files
- Custom dbg_summary_show implementation for k3-udma

Changes since v2:
- Use dma_chan_name() for printing the channel's name

Changes since v1:
- Use much more simplified fops for the debugfs file (via DEFINE_SHOW_ATTRIBUTE)
- do not allow modification to dma_device_list while the debugfs file is read
- rename the slave_name to dbg_client_name (it is only for debugging)
- print information about dma_router if it is used by the channel
- Formating of the output slightly changed

The basic debugfs file (/sys/kernel/debug/dmaengine/summary) can be used to
query basic information about the DMAengine usage (am654-evm):

# cat /sys/kernel/debug/dmaengine/summary
dma0 (285c0000.dma-controller): number of channels: 96

dma1 (31150000.dma-controller): number of channels: 267
 dma1chan0    | 2b00000.mcasp:tx
 dma1chan1    | 2b00000.mcasp:rx
 dma1chan2    | in-use
 dma1chan3    | in-use
 dma1chan4    | in-use
 dma1chan5    | in-use

Drivers can implement custom dbg_summary_show to add extended information via
the summary file, like with the second patch for k3-udma (j721e-evm):

# cat /sys/kernel/debug/dmaengine/summary
dma0 (285c0000.dma-controller): number of channels: 24

dma1 (31150000.dma-controller): number of channels: 84
 dma1chan0    | 2b00000.mcasp:tx (MEM_TO_DEV, tchan16 [0x1010 -> 0xc400], PDMA[ ACC32 BURST ], TR mode)
 dma1chan1    | 2b00000.mcasp:rx (DEV_TO_MEM, rchan16 [0x4400 -> 0x9010], PDMA[ ACC32 BURST ], TR mode)
 dma1chan2    | 2ba0000.mcasp:tx (MEM_TO_DEV, tchan17 [0x1011 -> 0xc507], PDMA[ ACC32 BURST ], TR mode)
 dma1chan3    | 2ba0000.mcasp:rx (DEV_TO_MEM, rchan17 [0x4507 -> 0x9011], PDMA[ ACC32 BURST ], TR mode)
 dma1chan4    | in-use (MEM_TO_MEM, chan0 pair [0x1000 -> 0x9000], PSI-L Native, TR mode)
 dma1chan5    | in-use (MEM_TO_MEM, chan1 pair [0x1001 -> 0x9001], PSI-L Native, TR mode)
 dma1chan6    | in-use (MEM_TO_MEM, chan4 pair [0x1004 -> 0x9004], PSI-L Native, TR mode)
 dma1chan7    | in-use (MEM_TO_MEM, chan5 pair [0x1005 -> 0x9005], PSI-L Native, TR mode)
 
Regards,
Peter
---
Peter Ujfalusi (2):
  dmaengine: Add basic debugfs support
  dmaengine: ti: k3-udma: Implement custom dbg_summary_show for debugfs

 drivers/dma/dmaengine.c   | 77 +++++++++++++++++++++++++++++++++++++++
 drivers/dma/dmaengine.h   |  6 +++
 drivers/dma/ti/k3-udma.c  | 63 ++++++++++++++++++++++++++++++++
 include/linux/dmaengine.h | 12 +++++-
 4 files changed, 157 insertions(+), 1 deletion(-)

-- 
Peter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/2] dmaengine: Add basic debugfs support
  2020-02-28 13:07 [PATCH v4 0/2] dmaengine: Initial debugfs support Peter Ujfalusi
@ 2020-02-28 13:07 ` " Peter Ujfalusi
  2020-03-02  7:11   ` Vinod Koul
  2020-02-28 13:07 ` [PATCH v4 2/2] dmaengine: ti: k3-udma: Implement custom dbg_summary_show for debugfs Peter Ujfalusi
  1 sibling, 1 reply; 7+ messages in thread
From: Peter Ujfalusi @ 2020-02-28 13:07 UTC (permalink / raw)
  To: vkoul; +Cc: dmaengine, linux-kernel, dan.j.williams, geert

Via the /sys/kernel/debug/dmaengine/summary users can get information
about the DMA devices and the used channels.

Example output on am654-evm with audio using two channels and after running
dmatest on 4 channels:

dma0 (285c0000.dma-controller): number of channels: 96

dma1 (31150000.dma-controller): number of channels: 267
 dma1chan0    | 2b00000.mcasp:tx
 dma1chan1    | 2b00000.mcasp:rx
 dma1chan2    | in-use
 dma1chan3    | in-use
 dma1chan4    | in-use
 dma1chan5    | in-use

For slave channels we can show the device and the channel name a given
channel is requested.
For non slave devices the only information we know is that the channel is
in use.

DMA drivers can implement the optional dbg_summary_show callback to
provide controller specific information instead of the generic one.

It is easy to extend the generic dmaengine_summary_show() to print
additional information about the used channels.

In case DMA drivers want to create additional files under the dmaengine
directory to provide additional debug points, they can use the
dmaengine_get_debugfs_root() to get the dentry of the rootdir.

I have taken the idea from gpiolib and clk subsystems.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/dma/dmaengine.c   | 77 +++++++++++++++++++++++++++++++++++++++
 drivers/dma/dmaengine.h   |  6 +++
 include/linux/dmaengine.h | 12 +++++-
 3 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
index c3b1283b6d31..b5e8b737785c 100644
--- a/drivers/dma/dmaengine.c
+++ b/drivers/dma/dmaengine.c
@@ -760,6 +760,11 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name)
 		return chan ? chan : ERR_PTR(-EPROBE_DEFER);
 
 found:
+#ifdef CONFIG_DEBUG_FS
+	chan->dbg_client_name = kasprintf(GFP_KERNEL, "%s:%s", dev_name(dev),
+					  name);
+#endif
+
 	chan->name = kasprintf(GFP_KERNEL, "dma:%s", name);
 	if (!chan->name)
 		return chan;
@@ -837,6 +842,11 @@ void dma_release_channel(struct dma_chan *chan)
 		chan->name = NULL;
 		chan->slave = NULL;
 	}
+
+#ifdef CONFIG_DEBUG_FS
+	kfree(chan->dbg_client_name);
+	chan->dbg_client_name = NULL;
+#endif
 	mutex_unlock(&dma_list_mutex);
 }
 EXPORT_SYMBOL_GPL(dma_release_channel);
@@ -1562,3 +1572,70 @@ static int __init dma_bus_init(void)
 	return class_register(&dma_devclass);
 }
 arch_initcall(dma_bus_init);
+
+#ifdef CONFIG_DEBUG_FS
+#include <linux/debugfs.h>
+
+static struct dentry *rootdir;
+
+struct dentry *dmaengine_get_debugfs_root(void)
+{
+	return rootdir;
+}
+EXPORT_SYMBOL_GPL(dmaengine_get_debugfs_root);
+
+static void dmaengine_dbg_summary_show(struct seq_file *s,
+				       struct dma_device *dma_dev)
+{
+	struct dma_chan *chan;
+
+	list_for_each_entry(chan, &dma_dev->channels, device_node) {
+		if (chan->client_count) {
+			seq_printf(s, " %-13s| %s", dma_chan_name(chan),
+				   chan->dbg_client_name ?: "in-use");
+
+			if (chan->router)
+				seq_printf(s, " (via router: %s)\n",
+					dev_name(chan->router->dev));
+			else
+				seq_puts(s, "\n");
+		}
+	}
+}
+
+static int dmaengine_summary_show(struct seq_file *s, void *data)
+{
+	struct dma_device *dma_dev = NULL;
+
+	mutex_lock(&dma_list_mutex);
+	list_for_each_entry(dma_dev, &dma_device_list, global_node) {
+		seq_printf(s, "dma%d (%s): number of channels: %u\n",
+			   dma_dev->dev_id, dev_name(dma_dev->dev),
+			   dma_dev->chancnt);
+
+		if (dma_dev->dbg_summary_show)
+			dma_dev->dbg_summary_show(s, dma_dev);
+		else
+			dmaengine_dbg_summary_show(s, dma_dev);
+
+		if (!list_is_last(&dma_dev->global_node, &dma_device_list))
+			seq_puts(s, "\n");
+	}
+	mutex_unlock(&dma_list_mutex);
+
+	return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(dmaengine_summary);
+
+static int __init dmaengine_debugfs_init(void)
+{
+	rootdir = debugfs_create_dir("dmaengine", NULL);
+
+	/* /sys/kernel/debug/dmaengine */
+	debugfs_create_file("summary", 0444, rootdir, NULL,
+			    &dmaengine_summary_fops);
+	return 0;
+}
+late_initcall(dmaengine_debugfs_init);
+
+#endif	/* DEBUG_FS */
diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
index e8a320c9e57c..72cd7fe33638 100644
--- a/drivers/dma/dmaengine.h
+++ b/drivers/dma/dmaengine.h
@@ -182,4 +182,10 @@ dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
 struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
 struct dma_chan *dma_get_any_slave_channel(struct dma_device *device);
 
+#ifdef CONFIG_DEBUG_FS
+#include <linux/debugfs.h>
+
+struct dentry *dmaengine_get_debugfs_root(void);
+#endif
+
 #endif
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h
index 64461fc64e1b..a0fff2f9f3b5 100644
--- a/include/linux/dmaengine.h
+++ b/include/linux/dmaengine.h
@@ -300,6 +300,8 @@ struct dma_router {
  * @chan_id: channel ID for sysfs
  * @dev: class device for sysfs
  * @name: backlink name for sysfs
+ * @dbg_client_name: slave name for debugfs in format:
+ *	dev_name(requester's dev):channel name, for example: "2b00000.mcasp:tx"
  * @device_node: used to add this to the device chan list
  * @local: per-cpu pointer to a struct dma_chan_percpu
  * @client_count: how many clients are using this channel
@@ -318,6 +320,9 @@ struct dma_chan {
 	int chan_id;
 	struct dma_chan_dev *dev;
 	const char *name;
+#ifdef CONFIG_DEBUG_FS
+	char *dbg_client_name;
+#endif
 
 	struct list_head device_node;
 	struct dma_chan_percpu __percpu *local;
@@ -805,7 +810,9 @@ struct dma_filter {
  *     called and there are no further references to this structure. This
  *     must be implemented to free resources however many existing drivers
  *     do not and are therefore not safe to unbind while in use.
- *
+ * @dbg_summary_show: optional routine to show contents in debugfs; default code
+ *     will be used when this is omitted, but custom code can show extra,
+ *     controller specific information.
  */
 struct dma_device {
 	struct kref ref;
@@ -891,6 +898,9 @@ struct dma_device {
 					    struct dma_tx_state *txstate);
 	void (*device_issue_pending)(struct dma_chan *chan);
 	void (*device_release)(struct dma_device *dev);
+#ifdef CONFIG_DEBUG_FS
+	void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev);
+#endif
 };
 
 static inline int dmaengine_slave_config(struct dma_chan *chan,
-- 
Peter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 2/2] dmaengine: ti: k3-udma: Implement custom dbg_summary_show for debugfs
  2020-02-28 13:07 [PATCH v4 0/2] dmaengine: Initial debugfs support Peter Ujfalusi
  2020-02-28 13:07 ` [PATCH v4 1/2] dmaengine: Add basic " Peter Ujfalusi
@ 2020-02-28 13:07 ` Peter Ujfalusi
  1 sibling, 0 replies; 7+ messages in thread
From: Peter Ujfalusi @ 2020-02-28 13:07 UTC (permalink / raw)
  To: vkoul; +Cc: dmaengine, linux-kernel, dan.j.williams, geert

With the custom dbg_summary_show the driver can show useful information
about the used channels.

dma0 (285c0000.dma-controller): number of channels: 24

dma1 (31150000.dma-controller): number of channels: 84
 dma1chan0    | 2b00000.mcasp:tx (MEM_TO_DEV, tchan16 [0x1010 -> 0xc400], PDMA[ ACC32 BURST ], TR mode)
 dma1chan1    | 2b00000.mcasp:rx (DEV_TO_MEM, rchan16 [0x4400 -> 0x9010], PDMA[ ACC32 BURST ], TR mode)
 dma1chan2    | 2ba0000.mcasp:tx (MEM_TO_DEV, tchan17 [0x1011 -> 0xc507], PDMA[ ACC32 BURST ], TR mode)
 dma1chan3    | 2ba0000.mcasp:rx (DEV_TO_MEM, rchan17 [0x4507 -> 0x9011], PDMA[ ACC32 BURST ], TR mode)
 dma1chan4    | in-use (MEM_TO_MEM, chan0 pair [0x1000 -> 0x9000], PSI-L Native, TR mode)
 dma1chan5    | in-use (MEM_TO_MEM, chan1 pair [0x1001 -> 0x9001], PSI-L Native, TR mode)
 dma1chan6    | in-use (MEM_TO_MEM, chan4 pair [0x1004 -> 0x9004], PSI-L Native, TR mode)
 dma1chan7    | in-use (MEM_TO_MEM, chan5 pair [0x1005 -> 0x9005], PSI-L Native, TR mode)

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
---
 drivers/dma/ti/k3-udma.c | 63 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
index 0536866a58ce..80a05ee5e8e4 100644
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -3473,6 +3473,66 @@ static int udma_setup_rx_flush(struct udma_dev *ud)
 	return 0;
 }
 
+#ifdef CONFIG_DEBUG_FS
+static void udma_dbg_summary_show_chan(struct seq_file *s,
+				       struct dma_chan *chan)
+{
+	struct udma_chan *uc = to_udma_chan(chan);
+	struct udma_chan_config *ucc = &uc->config;
+
+	seq_printf(s, " %-13s| %s", dma_chan_name(chan),
+		   chan->dbg_client_name ?: "in-use");
+	seq_printf(s, " (%s, ", dmaengine_get_direction_text(uc->config.dir));
+
+	switch (uc->config.dir) {
+	case DMA_MEM_TO_MEM:
+		seq_printf(s, "chan%d pair [0x%04x -> 0x%04x], ", uc->tchan->id,
+			   ucc->src_thread, ucc->dst_thread);
+		break;
+	case DMA_DEV_TO_MEM:
+		seq_printf(s, "rchan%d [0x%04x -> 0x%04x], ", uc->rchan->id,
+			   ucc->src_thread, ucc->dst_thread);
+		break;
+	case DMA_MEM_TO_DEV:
+		seq_printf(s, "tchan%d [0x%04x -> 0x%04x], ", uc->tchan->id,
+			   ucc->src_thread, ucc->dst_thread);
+		break;
+	default:
+		seq_printf(s, ")\n");
+		return;
+	}
+
+	if (ucc->ep_type == PSIL_EP_NATIVE) {
+		seq_printf(s, "PSI-L Native");
+		if (ucc->metadata_size) {
+			seq_printf(s, "[%s", ucc->needs_epib ? " EPIB" : "");
+			if (ucc->psd_size)
+				seq_printf(s, " PSDsize:%u", ucc->psd_size);
+			seq_printf(s, " ]");
+		}
+	} else {
+		seq_printf(s, "PDMA");
+		if (ucc->enable_acc32 || ucc->enable_burst)
+			seq_printf(s, "[%s%s ]",
+				   ucc->enable_acc32 ? " ACC32" : "",
+				   ucc->enable_burst ? " BURST" : "");
+	}
+
+	seq_printf(s, ", %s)\n", ucc->pkt_mode ? "Packet mode" : "TR mode");
+}
+
+static void udma_dbg_summary_show(struct seq_file *s,
+				  struct dma_device *dma_dev)
+{
+	struct dma_chan *chan;
+
+	list_for_each_entry(chan, &dma_dev->channels, device_node) {
+		if (chan->client_count)
+			udma_dbg_summary_show_chan(s, chan);
+	}
+}
+#endif /* CONFIG_DEBUG_FS */
+
 #define TI_UDMAC_BUSWIDTHS	(BIT(DMA_SLAVE_BUSWIDTH_1_BYTE) | \
 				 BIT(DMA_SLAVE_BUSWIDTH_2_BYTES) | \
 				 BIT(DMA_SLAVE_BUSWIDTH_3_BYTES) | \
@@ -3553,6 +3613,9 @@ static int udma_probe(struct platform_device *pdev)
 	ud->ddev.device_resume = udma_resume;
 	ud->ddev.device_terminate_all = udma_terminate_all;
 	ud->ddev.device_synchronize = udma_synchronize;
+#ifdef CONFIG_DEBUG_FS
+	ud->ddev.dbg_summary_show = udma_dbg_summary_show;
+#endif
 
 	ud->ddev.device_free_chan_resources = udma_free_chan_resources;
 	ud->ddev.src_addr_widths = TI_UDMAC_BUSWIDTHS;
-- 
Peter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/2] dmaengine: Add basic debugfs support
  2020-02-28 13:07 ` [PATCH v4 1/2] dmaengine: Add basic " Peter Ujfalusi
@ 2020-03-02  7:11   ` Vinod Koul
  2020-03-02 10:28     ` Peter Ujfalusi
  0 siblings, 1 reply; 7+ messages in thread
From: Vinod Koul @ 2020-03-02  7:11 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: dmaengine, linux-kernel, dan.j.williams, geert

On 28-02-20, 15:07, Peter Ujfalusi wrote:
> Via the /sys/kernel/debug/dmaengine/summary users can get information
> about the DMA devices and the used channels.
> 
> Example output on am654-evm with audio using two channels and after running
> dmatest on 4 channels:
> 
> dma0 (285c0000.dma-controller): number of channels: 96
> 
> dma1 (31150000.dma-controller): number of channels: 267
>  dma1chan0    | 2b00000.mcasp:tx
>  dma1chan1    | 2b00000.mcasp:rx
>  dma1chan2    | in-use
>  dma1chan3    | in-use
>  dma1chan4    | in-use
>  dma1chan5    | in-use
> 
> For slave channels we can show the device and the channel name a given
> channel is requested.
> For non slave devices the only information we know is that the channel is
> in use.
> 
> DMA drivers can implement the optional dbg_summary_show callback to
> provide controller specific information instead of the generic one.
> 
> It is easy to extend the generic dmaengine_summary_show() to print
> additional information about the used channels.
> 
> In case DMA drivers want to create additional files under the dmaengine
> directory to provide additional debug points, they can use the
> dmaengine_get_debugfs_root() to get the dentry of the rootdir.
> 
> I have taken the idea from gpiolib and clk subsystems.
> 
> Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> ---
>  drivers/dma/dmaengine.c   | 77 +++++++++++++++++++++++++++++++++++++++
>  drivers/dma/dmaengine.h   |  6 +++
>  include/linux/dmaengine.h | 12 +++++-
>  3 files changed, 94 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
> index c3b1283b6d31..b5e8b737785c 100644
> --- a/drivers/dma/dmaengine.c
> +++ b/drivers/dma/dmaengine.c
> @@ -760,6 +760,11 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name)
>  		return chan ? chan : ERR_PTR(-EPROBE_DEFER);
>  
>  found:
> +#ifdef CONFIG_DEBUG_FS
> +	chan->dbg_client_name = kasprintf(GFP_KERNEL, "%s:%s", dev_name(dev),
> +					  name);
> +#endif
> +
>  	chan->name = kasprintf(GFP_KERNEL, "dma:%s", name);
>  	if (!chan->name)
>  		return chan;
> @@ -837,6 +842,11 @@ void dma_release_channel(struct dma_chan *chan)
>  		chan->name = NULL;
>  		chan->slave = NULL;
>  	}
> +
> +#ifdef CONFIG_DEBUG_FS
> +	kfree(chan->dbg_client_name);
> +	chan->dbg_client_name = NULL;
> +#endif
>  	mutex_unlock(&dma_list_mutex);
>  }
>  EXPORT_SYMBOL_GPL(dma_release_channel);
> @@ -1562,3 +1572,70 @@ static int __init dma_bus_init(void)
>  	return class_register(&dma_devclass);
>  }
>  arch_initcall(dma_bus_init);
> +
> +#ifdef CONFIG_DEBUG_FS
> +#include <linux/debugfs.h>
> +
> +static struct dentry *rootdir;
> +
> +struct dentry *dmaengine_get_debugfs_root(void)
> +{
> +	return rootdir;
> +}
> +EXPORT_SYMBOL_GPL(dmaengine_get_debugfs_root);
> +
> +static void dmaengine_dbg_summary_show(struct seq_file *s,
> +				       struct dma_device *dma_dev)
> +{
> +	struct dma_chan *chan;
> +
> +	list_for_each_entry(chan, &dma_dev->channels, device_node) {
> +		if (chan->client_count) {
> +			seq_printf(s, " %-13s| %s", dma_chan_name(chan),
> +				   chan->dbg_client_name ?: "in-use");
> +
> +			if (chan->router)
> +				seq_printf(s, " (via router: %s)\n",
> +					dev_name(chan->router->dev));
> +			else
> +				seq_puts(s, "\n");
> +		}
> +	}
> +}
> +
> +static int dmaengine_summary_show(struct seq_file *s, void *data)
> +{
> +	struct dma_device *dma_dev = NULL;
> +
> +	mutex_lock(&dma_list_mutex);
> +	list_for_each_entry(dma_dev, &dma_device_list, global_node) {
> +		seq_printf(s, "dma%d (%s): number of channels: %u\n",
> +			   dma_dev->dev_id, dev_name(dma_dev->dev),
> +			   dma_dev->chancnt);
> +
> +		if (dma_dev->dbg_summary_show)
> +			dma_dev->dbg_summary_show(s, dma_dev);
> +		else
> +			dmaengine_dbg_summary_show(s, dma_dev);
> +
> +		if (!list_is_last(&dma_dev->global_node, &dma_device_list))
> +			seq_puts(s, "\n");
> +	}
> +	mutex_unlock(&dma_list_mutex);
> +
> +	return 0;
> +}
> +DEFINE_SHOW_ATTRIBUTE(dmaengine_summary);
> +
> +static int __init dmaengine_debugfs_init(void)
> +{
> +	rootdir = debugfs_create_dir("dmaengine", NULL);
> +
> +	/* /sys/kernel/debug/dmaengine */
> +	debugfs_create_file("summary", 0444, rootdir, NULL,
> +			    &dmaengine_summary_fops);
> +	return 0;
> +}
> +late_initcall(dmaengine_debugfs_init);
> +
> +#endif	/* DEBUG_FS */
> diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
> index e8a320c9e57c..72cd7fe33638 100644
> --- a/drivers/dma/dmaengine.h
> +++ b/drivers/dma/dmaengine.h
> @@ -182,4 +182,10 @@ dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
>  struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
>  struct dma_chan *dma_get_any_slave_channel(struct dma_device *device);
>  
> +#ifdef CONFIG_DEBUG_FS
> +#include <linux/debugfs.h>
> +
> +struct dentry *dmaengine_get_debugfs_root(void);

this needs to have an else defined with NULL return so that we dont
force users to wrap the code under CONFIG_DEBUG_FS..

-- 
~Vinod

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/2] dmaengine: Add basic debugfs support
  2020-03-02  7:11   ` Vinod Koul
@ 2020-03-02 10:28     ` Peter Ujfalusi
  2020-03-02 11:53       ` Peter Ujfalusi
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Ujfalusi @ 2020-03-02 10:28 UTC (permalink / raw)
  To: Vinod Koul; +Cc: dmaengine, linux-kernel, dan.j.williams, geert

Hi Vinod,

On 02/03/2020 9.11, Vinod Koul wrote:
>> diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
>> index e8a320c9e57c..72cd7fe33638 100644
>> --- a/drivers/dma/dmaengine.h
>> +++ b/drivers/dma/dmaengine.h
>> @@ -182,4 +182,10 @@ dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
>>  struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
>>  struct dma_chan *dma_get_any_slave_channel(struct dma_device *device);
>>  
>> +#ifdef CONFIG_DEBUG_FS
>> +#include <linux/debugfs.h>
>> +
>> +struct dentry *dmaengine_get_debugfs_root(void);
> 
> this needs to have an else defined with NULL return so that we dont
> force users to wrap the code under CONFIG_DEBUG_FS..

Drivers would anyways should have their debugfs related code wrapped
within ifdef. There is no point of having the code complied when it can
not be used (no debugfs support).

But I can add the  else case if we really want to:

#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>

struct dentry *dmaengine_get_debugfs_root(void);

#else
struct dentry;
static inline struct dentry *dmaengine_get_debugfs_root(void)
{
	return NULL;
}
#endif /* CONFIG_DEBUG_FS */


- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/2] dmaengine: Add basic debugfs support
  2020-03-02 10:28     ` Peter Ujfalusi
@ 2020-03-02 11:53       ` Peter Ujfalusi
  2020-03-03  4:27         ` Vinod Koul
  0 siblings, 1 reply; 7+ messages in thread
From: Peter Ujfalusi @ 2020-03-02 11:53 UTC (permalink / raw)
  To: Vinod Koul; +Cc: dmaengine, linux-kernel, dan.j.williams, geert



On 02/03/2020 12.28, Peter Ujfalusi wrote:
> Hi Vinod,
> 
> On 02/03/2020 9.11, Vinod Koul wrote:
>>> diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
>>> index e8a320c9e57c..72cd7fe33638 100644
>>> --- a/drivers/dma/dmaengine.h
>>> +++ b/drivers/dma/dmaengine.h
>>> @@ -182,4 +182,10 @@ dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
>>>  struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
>>>  struct dma_chan *dma_get_any_slave_channel(struct dma_device *device);
>>>  
>>> +#ifdef CONFIG_DEBUG_FS
>>> +#include <linux/debugfs.h>
>>> +
>>> +struct dentry *dmaengine_get_debugfs_root(void);
>>
>> this needs to have an else defined with NULL return so that we dont
>> force users to wrap the code under CONFIG_DEBUG_FS..
> 
> Drivers would anyways should have their debugfs related code wrapped
> within ifdef. There is no point of having the code complied when it can
> not be used (no debugfs support).
> 
> But I can add the  else case if we really want to:
> 
> #ifdef CONFIG_DEBUG_FS
> #include <linux/debugfs.h>
> 
> struct dentry *dmaengine_get_debugfs_root(void);
> 
> #else
> struct dentry;
> static inline struct dentry *dmaengine_get_debugfs_root(void)
> {
> 	return NULL;
> }
> #endif /* CONFIG_DEBUG_FS */

It might be even better if the core creates directories for the dma
controllers in dma_async_device_register() and removes the whole
directory in dma_async_device_unregister()

Then drivers can get their per device root via:
#ifdef CONFIG_DEBUG_FS
static inline struct dentry *
dmaengine_get_debugfs_root(struct dma_device *dma_dev) {
	return dma_dev->dbg_dev_root;
}
#else
struct dentry;
static inline struct dentry *
dmaengine_get_debugfs_root(struct dma_device *dma_dev)
{
	return NULL;
}
#endif /* CONFIG_DEBUG_FS */

- Péter

Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 1/2] dmaengine: Add basic debugfs support
  2020-03-02 11:53       ` Peter Ujfalusi
@ 2020-03-03  4:27         ` Vinod Koul
  0 siblings, 0 replies; 7+ messages in thread
From: Vinod Koul @ 2020-03-03  4:27 UTC (permalink / raw)
  To: Peter Ujfalusi; +Cc: dmaengine, linux-kernel, dan.j.williams, geert

On 02-03-20, 13:53, Peter Ujfalusi wrote:
> 
> 
> On 02/03/2020 12.28, Peter Ujfalusi wrote:
> > Hi Vinod,
> > 
> > On 02/03/2020 9.11, Vinod Koul wrote:
> >>> diff --git a/drivers/dma/dmaengine.h b/drivers/dma/dmaengine.h
> >>> index e8a320c9e57c..72cd7fe33638 100644
> >>> --- a/drivers/dma/dmaengine.h
> >>> +++ b/drivers/dma/dmaengine.h
> >>> @@ -182,4 +182,10 @@ dmaengine_desc_callback_valid(struct dmaengine_desc_callback *cb)
> >>>  struct dma_chan *dma_get_slave_channel(struct dma_chan *chan);
> >>>  struct dma_chan *dma_get_any_slave_channel(struct dma_device *device);
> >>>  
> >>> +#ifdef CONFIG_DEBUG_FS
> >>> +#include <linux/debugfs.h>
> >>> +
> >>> +struct dentry *dmaengine_get_debugfs_root(void);
> >>
> >> this needs to have an else defined with NULL return so that we dont
> >> force users to wrap the code under CONFIG_DEBUG_FS..
> > 
> > Drivers would anyways should have their debugfs related code wrapped
> > within ifdef. There is no point of having the code complied when it can
> > not be used (no debugfs support).
> > 
> > But I can add the  else case if we really want to:
> > 
> > #ifdef CONFIG_DEBUG_FS
> > #include <linux/debugfs.h>
> > 
> > struct dentry *dmaengine_get_debugfs_root(void);
> > 
> > #else
> > struct dentry;
> > static inline struct dentry *dmaengine_get_debugfs_root(void)
> > {
> > 	return NULL;
> > }
> > #endif /* CONFIG_DEBUG_FS */
> 
> It might be even better if the core creates directories for the dma
> controllers in dma_async_device_register() and removes the whole
> directory in dma_async_device_unregister()

hmmm, i think makes sense and dentry can be part of dma_device

> 
> Then drivers can get their per device root via:
> #ifdef CONFIG_DEBUG_FS
> static inline struct dentry *
> dmaengine_get_debugfs_root(struct dma_device *dma_dev) {
> 	return dma_dev->dbg_dev_root;
> }

right!

> #else
> struct dentry;
> static inline struct dentry *
> dmaengine_get_debugfs_root(struct dma_device *dma_dev)
> {
> 	return NULL;
> }
> #endif /* CONFIG_DEBUG_FS */

-- 
~Vinod

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, back to index

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-28 13:07 [PATCH v4 0/2] dmaengine: Initial debugfs support Peter Ujfalusi
2020-02-28 13:07 ` [PATCH v4 1/2] dmaengine: Add basic " Peter Ujfalusi
2020-03-02  7:11   ` Vinod Koul
2020-03-02 10:28     ` Peter Ujfalusi
2020-03-02 11:53       ` Peter Ujfalusi
2020-03-03  4:27         ` Vinod Koul
2020-02-28 13:07 ` [PATCH v4 2/2] dmaengine: ti: k3-udma: Implement custom dbg_summary_show for debugfs Peter Ujfalusi

dmaengine Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/dmaengine/0 dmaengine/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 dmaengine dmaengine/ https://lore.kernel.org/dmaengine \
		dmaengine@vger.kernel.org
	public-inbox-index dmaengine

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.dmaengine


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git