[U-Boot] [PATCH v2 2/3] dm: add a command to list devices in a tree-like format

Masahiro Yamada yamada.m at jp.panasonic.com
Fri Nov 21 08:04:55 CET 2014


Hi Simon,


On Thu, 20 Nov 2014 15:00:41 +0000
Simon Glass <sjg at chromium.org> wrote:

> Hi Masahiro,
> 
> On 20 November 2014 12:20, Masahiro Yamada <yamada.m at jp.panasonic.com> wrote:
> > We are adding more and more drivers to driver model these days.
> > Compared with the ad-hoc driver system, it seems pretty difficult to
> > understand how drivers are working on driver model.  For ex.
> >   - Which devices have been bound?
> >   - Which devices have been probed?
> >   - Which is the parent of this device?
> > etc.
> >
> > I hope this tool will help us test/review driver model patches.
> >
> > Just hit "showdev" on the command line and it will list all the bound
> > devices in a tree-like format with Class and Probed flag.
> 
> This looks very similar to the 'dm tree' command. Can we unify these?
> Perhaps move the commands into common/cmd_dm.c? Then we can use the
> CONFIG_CMD_DM option instead of a new one.
> 
> Also I think 'dm xxx' is better than things 'showdev'. The 'dm' prefix
> can be used for all DM commands.

Sorry, I did not know you had already implemented a similar one.
There is no point to have two commands to do equivalent stuff.

The difference is some appearances and
that pointer addresses are missing from mine.

I think my 4 columns indentation is more readable, but
it might be my personal preference.

So, if you prefer the current one, feel free to reject mine, of course.
Or shall I change "dm tree" to something like mine?

What shall I do?



> > +
> > +#include <common.h>
> > +#include <linux/string.h>
> > +#include <linux/list.h>
> > +#include <dm/device.h>
> > +#include <dm/uclass.h>
> > +
> > +DECLARE_GLOBAL_DATA_PTR;
> > +
> > +#define INDENT1 "    "
> > +#define INDENT2 "|   "
> > +#define INDENT3 "\\-- "
> > +#define INDENT4 "|-- "
> 
> Is there really any value in these?

Not really.
I just thought that it might be helpful if we want to change the indentation width.


> > +
> > +static void show_devices(struct udevice *dev, int depth, int last_flag)
> > +{
> > +       int i, is_last;
> > +       struct udevice *child;
> > +       char class_name[12];
> > +
> > +       /* print the first 11 characters to not break the tree-format. */
> > +       strlcpy(class_name, dev->uclass->uc_drv->name, sizeof(class_name));
> > +       printf(" %-11s ", class_name);
> > +
> > +       printf("[ %c ]    ", dev->flags & DM_FLAG_ACTIVATED ? '+' : ' ');
> 
> This line could be combined with the above.


Yes, indeed.

> > +
> > +       for (i = depth; i >= 0; i--) {
> > +               is_last = (last_flag >> i) & 1;
> > +               if (i) {
> > +                       if (is_last)
> > +                               printf(INDENT1);
> > +                       else
> > +                               printf(INDENT2);
> > +               } else {
> > +                       if (is_last)
> > +                               printf(INDENT3);
> > +                       else
> > +                               printf(INDENT4);
> > +               }
> > +       }
> > +
> > +       printf("%s\n", dev->name);
> > +
> > +       list_for_each_entry(child, &dev->child_head, sibling_node) {
> > +               is_last = list_is_last(&child->sibling_node, &dev->child_head);
> > +               show_devices(child, depth + 1, (last_flag << 1) | is_last);
> > +       }
> > +}
> > +
> > +static int do_showdev(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> > +{
> > +       printf(" Class       Probed   Name\n");
> 
> Remove the first space?


I inserted the first space for readability, but it might not be necessary.



BTW, I read your code but I could not understand
why you used  list_for_each_entry_safe() in display_succ(),
whilst list_for_each_entry() in do_dm_dump_uclass().

Is there a special reason for inconsintency?


Best Regards
Masahiro Yamada



More information about the U-Boot mailing list