[U-Boot] [PATCH v2 12/14] devres: add debug command to dump device resources

Masahiro Yamada
2015-07-13T04:17:15Z

This new command can dump all device resources associated to
each device. The fields in every line shows:
- The address of the resource
- The size of the resource
- The name of the release function
- The stage in which the resource has been acquired (BIND/PROBE)

The output looks like this:

=> devres
- root_driver
- soc
- extbus
- serial at 54006800
0xbfb541e8 (8 byte) devm_kmalloc_release BIND
0xbfb54440 (4 byte) devm_kmalloc_release PROBE
0xbfb54460 (4 byte) devm_kmalloc_release PROBE
- serial at 54006900
0xbfb54270 (8 byte) devm_kmalloc_release BIND
- gpio at 55000000
- i2c at 58780000
0xbfb5bce8 (12 byte) devm_kmalloc_release PROBE
0xbfb5bd10 (4 byte) devm_kmalloc_release PROBE
- eeprom
0xbfb54418 (12 byte) devm_kmalloc_release BIND

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
---

Changes in v2:
- add static to dump_resources()

drivers/core/Kconfig | 6 ++++++
drivers/core/devres.c | 37 +++++++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+)

diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index 5966801..edaf3fd 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -65,3 +65,9 @@ config DEBUG_DEVRES
debug resource management for a managed device.

If you are unsure about this, Say N here.
+
+config CMD_DEVRES
+ bool "Managed device resources dump command"
+ depends on DEBUG_DEVRES
+ help
+ This command displays all resources allociated to each device.
diff --git a/drivers/core/devres.c b/drivers/core/devres.c
index ae0c191..77f39a5 100644
--- a/drivers/core/devres.c
+++ b/drivers/core/devres.c
@@ -13,6 +13,7 @@
#include <linux/kernel.h>
#include <linux/list.h>
#include <dm/device.h>
+#include <dm/root.h>

struct devres {
struct list_head entry;
@@ -186,6 +187,42 @@ void devres_release_all(struct udevice *dev)
release_nodes(dev, &dev->devres_head, false);
}

+#ifdef CONFIG_CMD_DEVRES
+static void dump_resources(struct udevice *dev, int depth)
+{
+ struct devres *dr;
+ struct udevice *child;
+
+ printf("- %s\n", dev->name);
+
+ list_for_each_entry(dr, &dev->devres_head, entry)
+ printf(" 0x%p (%lu byte) %s %s\n", dr,
+ (unsigned long)dr->size, dr->name,
+ dr->probe ? "PROBE" : "BIND");
+
+ list_for_each_entry(child, &dev->child_head, sibling_node)
+ dump_resources(child, depth + 1);
+}
+
+static int do_devres(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[])
+{
+ struct udevice *root;
+
+ root = dm_root();
+ if (root)
+ dump_resources(root, 0);
+
+ return 0;
+}
+
+U_BOOT_CMD(
+ devres, 1, 1, do_devres,
+ "show device resources",
+ ""
+);
+#endif
+
/*
* Managed kmalloc/kfree
*/
--
1.9.1