diff mbox series

[v3] cmd: Add command to dump drivers and compatible strings

Message ID 20200206170349.1151628-1-seanga2@gmail.com
State New
Headers show
Series [v3] cmd: Add command to dump drivers and compatible strings | expand

Commit Message

Sean Anderson Feb. 6, 2020, 5:03 p.m. UTC
This adds a subcommand to dm to dump out what drivers are installed, and their
compatible strings. I have found this useful in ensuring that I have the correct
drivers compiled, and that I have put in the correct compatible strings.

Signed-off-by: Sean Anderson <seanga2 at gmail.com>
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
Tested-by: Bin Meng <bmeng.cn at gmail.com>

---

Changes in v3:
- Add python test

Changes in v2:
- Check if entry->of_match is NULL before accessing it
- Remove trailing newline in help message

 cmd/dm.c                 | 12 +++++++++++-
 drivers/core/dump.c      | 20 ++++++++++++++++++++
 include/dm/util.h        |  3 +++
 test/py/tests/test_dm.py | 17 +++++++++++++++++
 4 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 test/py/tests/test_dm.py

Comments

Simon Glass Feb. 6, 2020, 5:46 p.m. UTC | #1
On Thu, 6 Feb 2020 at 10:03, Sean Anderson <seanga2 at gmail.com> wrote:
>
> This adds a subcommand to dm to dump out what drivers are installed, and their
> compatible strings. I have found this useful in ensuring that I have the correct
> drivers compiled, and that I have put in the correct compatible strings.
>
> Signed-off-by: Sean Anderson <seanga2 at gmail.com>
> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> Tested-by: Bin Meng <bmeng.cn at gmail.com>
>
> ---
>
> Changes in v3:
> - Add python test
>
> Changes in v2:
> - Check if entry->of_match is NULL before accessing it
> - Remove trailing newline in help message
>
>  cmd/dm.c                 | 12 +++++++++++-
>  drivers/core/dump.c      | 20 ++++++++++++++++++++
>  include/dm/util.h        |  3 +++
>  test/py/tests/test_dm.py | 17 +++++++++++++++++
>  4 files changed, 51 insertions(+), 1 deletion(-)
>  create mode 100644 test/py/tests/test_dm.py

Reviewed-by: Simon Glass <sjg at chromium.org>
Bin Meng Feb. 19, 2020, 3:45 p.m. UTC | #2
Hi Simon,

On Fri, Feb 7, 2020 at 1:46 AM Simon Glass <sjg at chromium.org> wrote:
>
> On Thu, 6 Feb 2020 at 10:03, Sean Anderson <seanga2 at gmail.com> wrote:
> >
> > This adds a subcommand to dm to dump out what drivers are installed, and their
> > compatible strings. I have found this useful in ensuring that I have the correct
> > drivers compiled, and that I have put in the correct compatible strings.
> >
> > Signed-off-by: Sean Anderson <seanga2 at gmail.com>
> > Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> > Tested-by: Bin Meng <bmeng.cn at gmail.com>
> >
> > ---
> >
> > Changes in v3:
> > - Add python test
> >
> > Changes in v2:
> > - Check if entry->of_match is NULL before accessing it
> > - Remove trailing newline in help message
> >
> >  cmd/dm.c                 | 12 +++++++++++-
> >  drivers/core/dump.c      | 20 ++++++++++++++++++++
> >  include/dm/util.h        |  3 +++
> >  test/py/tests/test_dm.py | 17 +++++++++++++++++

Is this what you're looking for? I thought we need something in
test/dm C test cases instead?

> >  4 files changed, 51 insertions(+), 1 deletion(-)
> >  create mode 100644 test/py/tests/test_dm.py
>
> Reviewed-by: Simon Glass <sjg at chromium.org>

Regards,
Bin
Sean Anderson Feb. 19, 2020, 8:12 p.m. UTC | #3
On 2/19/20 10:45 AM, Bin Meng wrote:
> Hi Simon,
> 
> On Fri, Feb 7, 2020 at 1:46 AM Simon Glass <sjg at chromium.org> wrote:
>>
>> On Thu, 6 Feb 2020 at 10:03, Sean Anderson <seanga2 at gmail.com> wrote:
>>>
>>> This adds a subcommand to dm to dump out what drivers are installed, and their
>>> compatible strings. I have found this useful in ensuring that I have the correct
>>> drivers compiled, and that I have put in the correct compatible strings.
>>>
>>> Signed-off-by: Sean Anderson <seanga2 at gmail.com>
>>> Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
>>> Tested-by: Bin Meng <bmeng.cn at gmail.com>
>>>
>>> ---
>>>
>>> Changes in v3:
>>> - Add python test
>>>
>>> Changes in v2:
>>> - Check if entry->of_match is NULL before accessing it
>>> - Remove trailing newline in help message
>>>
>>>  cmd/dm.c                 | 12 +++++++++++-
>>>  drivers/core/dump.c      | 20 ++++++++++++++++++++
>>>  include/dm/util.h        |  3 +++
>>>  test/py/tests/test_dm.py | 17 +++++++++++++++++
> 
> Is this what you're looking for? I thought we need something in
> test/dm C test cases instead?

Tests for commands seem to be python tests. I considered writing a dm
test, but afiak that seems to be for testing function calls. There does
not seem to be an easy way to grab the console output. Additionally,
where would the authoritative list of installed drivers come from? The
easiest way would be to just use the same api that the command is using,
but this doesn't really test anything. As it is, the current test does
an ok job at correlating different methods of accessing the DM system
from the associated commands. It will also catch null-dereference bugs
like the one I found during testing.

--Sean
Simon Glass Feb. 20, 2020, 2:23 a.m. UTC | #4
Hi Bin,

On Wed, 19 Feb 2020 at 08:45, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi Simon,
>
> On Fri, Feb 7, 2020 at 1:46 AM Simon Glass <sjg at chromium.org> wrote:
> >
> > On Thu, 6 Feb 2020 at 10:03, Sean Anderson <seanga2 at gmail.com> wrote:
> > >
> > > This adds a subcommand to dm to dump out what drivers are installed, and their
> > > compatible strings. I have found this useful in ensuring that I have the correct
> > > drivers compiled, and that I have put in the correct compatible strings.
> > >
> > > Signed-off-by: Sean Anderson <seanga2 at gmail.com>
> > > Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> > > Tested-by: Bin Meng <bmeng.cn at gmail.com>
> > >
> > > ---
> > >
> > > Changes in v3:
> > > - Add python test
> > >
> > > Changes in v2:
> > > - Check if entry->of_match is NULL before accessing it
> > > - Remove trailing newline in help message
> > >
> > >  cmd/dm.c                 | 12 +++++++++++-
> > >  drivers/core/dump.c      | 20 ++++++++++++++++++++
> > >  include/dm/util.h        |  3 +++
> > >  test/py/tests/test_dm.py | 17 +++++++++++++++++
>
> Is this what you're looking for? I thought we need something in
> test/dm C test cases instead?

I would prefer C but this test only runs two commands so is not too bad.

Regards,
Simon
diff mbox series

Patch

diff --git a/cmd/dm.c b/cmd/dm.c
index 7b271db0bb..7a90685f8b 100644
--- a/cmd/dm.c
+++ b/cmd/dm.c
@@ -40,10 +40,19 @@  static int do_dm_dump_devres(cmd_tbl_t *cmdtp, int flag, int argc,
 	return 0;
 }
 
+static int do_dm_dump_drivers(cmd_tbl_t *cmdtp, int flag, int argc,
+			      char * const argv[])
+{
+	dm_dump_drivers();
+
+	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, "", ""),
+	U_BOOT_CMD_MKENT(drivers, 1, 1, do_dm_dump_drivers, "", ""),
 };
 
 static __maybe_unused void dm_reloc(void)
@@ -84,5 +93,6 @@  U_BOOT_CMD(
 	"Driver model low level access",
 	"tree          Dump driver model tree ('*' = activated)\n"
 	"dm uclass        Dump list of instances for each uclass\n"
-	"dm devres        Dump list of device resources for each device"
+	"dm devres        Dump list of device resources for each device\n"
+	"dm drivers       Dump list of drivers and their compatible strings"
 );
diff --git a/drivers/core/dump.c b/drivers/core/dump.c
index 4704049aee..b5046398d4 100644
--- a/drivers/core/dump.c
+++ b/drivers/core/dump.c
@@ -96,3 +96,23 @@  void dm_dump_uclass(void)
 		puts("\n");
 	}
 }
+
+void dm_dump_drivers(void)
+{
+	struct driver *d = ll_entry_start(struct driver, driver);
+	const int n_ents = ll_entry_count(struct driver, driver);
+	struct driver *entry;
+	const struct udevice_id *match;
+
+	puts("Driver                Compatible\n");
+	puts("--------------------------------\n");
+	for (entry = d; entry < d + n_ents; entry++) {
+		for (match = entry->of_match;
+		     match && match->compatible; match++)
+			printf("%-20.20s  %s\n",
+			       match == entry->of_match ? entry->name : "",
+			       match->compatible);
+		if (match == entry->of_match)
+			printf("%-20.20s\n", entry->name);
+	}
+}
diff --git a/include/dm/util.h b/include/dm/util.h
index 348c2ace3c..0ccb3fbadf 100644
--- a/include/dm/util.h
+++ b/include/dm/util.h
@@ -39,6 +39,9 @@  static inline void dm_dump_devres(void)
 }
 #endif
 
+/* Dump out a list of drivers */
+void dm_dump_drivers(void);
+
 /**
  * Check if an of node should be or was bound before relocation.
  *
diff --git a/test/py/tests/test_dm.py b/test/py/tests/test_dm.py
new file mode 100644
index 0000000000..f6fbf8ba4c
--- /dev/null
+++ b/test/py/tests/test_dm.py
@@ -0,0 +1,17 @@ 
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2020 Sean Anderson
+
+import pytest
+
+ at pytest.mark.buildconfigspec('cmd_dm')
+def test_dm_drivers(u_boot_console):
+    """Test that each driver in `dm tree` is also listed in `dm drivers`."""
+    response = u_boot_console.run_command('dm tree')
+    driver_index = response.find('Driver')
+    assert driver_index != -1
+    drivers = (line[driver_index:].split()[0]
+               for line in response[:-1].split('\n')[2:])
+
+    response = u_boot_console.run_command('dm drivers')
+    for driver in drivers:
+        assert driver in response