]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
devres: add debug command to dump device resources
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Sat, 25 Jul 2015 12:52:38 +0000 (21:52 +0900)
committerLothar Waßmann <LW@KARO-electronics.de>
Thu, 10 Sep 2015 06:17:18 +0000 (08:17 +0200)
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>
drivers/core/Kconfig
drivers/core/devres.c
include/dm/util.h
test/dm/cmd_dm.c

index 8ae0072aa90166f89f742bb4d2438d97bb72aa8f..c82b5645cdfd86dface18dac4959980b3c2361c4 100644 (file)
@@ -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.
 
index f235c1bcfddb4b3c2c6128b69dc5fedab9001e08..605295bd14d52e875db71e6b3eb992dd177169e8 100644 (file)
@@ -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
  */
index 7dbed6793f887dd38b50a8ef92f23b677e00ae3c..15daa3d19f1021a70d351095dfc46f7e9b5af38b 100644 (file)
@@ -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
index 5c501ec2541b85756b59f8038dd0f89c5c2add0c..caff49aa4f6201aa4358968d21aca6bf37689f4d 100644 (file)
@@ -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"
 );