]> git.karo-electronics.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)
committerSimon Glass <sjg@chromium.org>
Thu, 6 Aug 2015 13:44:29 +0000 (07:44 -0600)
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
          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.
        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.
 
          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 <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
 
 /**
  * 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);
 }
 
        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
  */
 /*
  * 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);
 
 /* 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
 #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;
 }
 
        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, "", ""),
 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[])
 };
 
 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,     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"
 );
 );