summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2015-07-25 21:52:38 +0900
committerSimon Glass <sjg@chromium.org>2015-08-06 07:44:29 -0600
commit40b6f2d020ca8074ed38a1b6bfa170aead1a170e (patch)
treeb61bf406f3a446982869d10aa7fdd6fb82e0f934
parente2282d70763ddf06f9b02007445729c841ef4083 (diff)
downloadtalos-obmc-uboot-40b6f2d020ca8074ed38a1b6bfa170aead1a170e.tar.gz
talos-obmc-uboot-40b6f2d020ca8074ed38a1b6bfa170aead1a170e.zip
devres: add debug command to dump device resources
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) Currently, there is no driver using devres, but if such drivers are implemented, the output of this command should look like this: => dm devres - root_driver - soc - extbus - serial@54006800 bfb541e8 (8 byte) devm_kmalloc_release BIND bfb54440 (4 byte) devm_kmalloc_release PROBE bfb54460 (4 byte) devm_kmalloc_release PROBE - serial@54006900 bfb54270 (8 byte) devm_kmalloc_release BIND - gpio@55000000 - i2c@58780000 bfb5bce8 (12 byte) devm_kmalloc_release PROBE bfb5bd10 (4 byte) devm_kmalloc_release PROBE - eeprom bfb54418 (12 byte) devm_kmalloc_release BIND Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Acked-by: Simon Glass <sjg@chromium.org>
-rw-r--r--drivers/core/Kconfig3
-rw-r--r--drivers/core/devres.c29
-rw-r--r--include/dm/util.h9
-rw-r--r--test/dm/cmd_dm.c12
4 files changed, 51 insertions, 2 deletions
diff --git a/drivers/core/Kconfig b/drivers/core/Kconfig
index 8ae0072aa9..c82b5645cd 100644
--- a/drivers/core/Kconfig
+++ b/drivers/core/Kconfig
@@ -93,10 +93,11 @@ config DEVRES
devm_kmalloc() to kmalloc(), etc.
config DEBUG_DEVRES
- bool "Managed device resources verbose debug messages"
+ bool "Managed device resources debugging functions"
depends on DEVRES
help
If this option is enabled, devres debug messages are printed.
+ Also, a function is available to dump a list of device resources.
Select this if you are having a problem with devres or want to
debug resource management for a managed device.
diff --git a/drivers/core/devres.c b/drivers/core/devres.c
index f235c1bcfd..605295bd14 100644
--- a/drivers/core/devres.c
+++ b/drivers/core/devres.c
@@ -13,6 +13,8 @@
#include <linux/kernel.h>
#include <linux/list.h>
#include <dm/device.h>
+#include <dm/root.h>
+#include <dm/util.h>
/**
* struct devres - Bookkeeping info for managed device resource
@@ -195,6 +197,33 @@ void devres_release_all(struct udevice *dev)
release_nodes(dev, &dev->devres_head, false);
}
+#ifdef CONFIG_DEBUG_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(" %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);
+}
+
+void dm_dump_devres(void)
+{
+ struct udevice *root;
+
+ root = dm_root();
+ if (root)
+ dump_resources(root, 0);
+}
+#endif
+
/*
* Managed kmalloc/kfree
*/
diff --git a/include/dm/util.h b/include/dm/util.h
index 7dbed6793f..15daa3d19f 100644
--- a/include/dm/util.h
+++ b/include/dm/util.h
@@ -39,4 +39,13 @@ void dm_dump_all(void);
/* Dump out a list of uclasses and their devices */
void dm_dump_uclass(void);
+#ifdef CONFIG_DEBUG_DEVRES
+/* Dump out a list of device resources */
+void dm_dump_devres(void);
+#else
+static inline void dm_dump_devres(void)
+{
+}
+#endif
+
#endif
diff --git a/test/dm/cmd_dm.c b/test/dm/cmd_dm.c
index 5c501ec254..caff49aa4f 100644
--- a/test/dm/cmd_dm.c
+++ b/test/dm/cmd_dm.c
@@ -32,9 +32,18 @@ static int do_dm_dump_uclass(cmd_tbl_t *cmdtp, int flag, int argc,
return 0;
}
+static int do_dm_dump_devres(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[])
+{
+ dm_dump_devres();
+
+ return 0;
+}
+
static cmd_tbl_t test_commands[] = {
U_BOOT_CMD_MKENT(tree, 0, 1, do_dm_dump_all, "", ""),
U_BOOT_CMD_MKENT(uclass, 1, 1, do_dm_dump_uclass, "", ""),
+ U_BOOT_CMD_MKENT(devres, 1, 1, do_dm_dump_devres, "", ""),
};
static int do_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
@@ -60,5 +69,6 @@ U_BOOT_CMD(
dm, 3, 1, do_dm,
"Driver model low level access",
"tree Dump driver model tree ('*' = activated)\n"
- "dm uclass Dump list of instances for each uclass"
+ "dm uclass Dump list of instances for each uclass\n"
+ "dm devres Dump list of device resources for each device"
);
OpenPOWER on IntegriCloud