diff mbox series

[v2,3/3] cmd: dm: Fixed/Added DM driver listing subcommands

Message ID 20200319161330.1195470-4-lusus@denx.de
State Superseded
Headers show
Series cmd: add driver, fs and part type listing commands | expand

Commit Message

Niel Fourie March 19, 2020, 4:13 p.m. UTC
Renamed dm "drivers" subcommand to "compat" (as it listed
compatibility strings) and prevent it from segfaulting when
drivers have no of_match populated.

Added a new "drivers" subcommand to dump a list of all known DM
drivers and for each, their uclass id, uclass driver and names of
attached devices.

Added a new "static" subcommand to dump a list of DM drivers with
statically defined platform data.

Signed-off-by: Niel Fourie <lusus at denx.de>
CC: Simon Glass <sjg at chromium.org>
CC: Sean Anderson <seanga2 at gmail.com>
---
Depends on: https://patchwork.ozlabs.org/patch/1234460/

Changes in v2:
- Add/extend Python tests
- Fixed minor formatting/typographical errors

 cmd/dm.c                 | 22 +++++++++++++++-
 drivers/core/dump.c      | 55 +++++++++++++++++++++++++++++++++++++++-
 include/dm/util.h        |  6 +++++
 test/py/tests/test_dm.py | 22 ++++++++++++++--
 4 files changed, 101 insertions(+), 4 deletions(-)

Comments

Sean Anderson March 19, 2020, 6:37 p.m. UTC | #1
On 3/19/20 12:13 PM, Niel Fourie wrote:
> Renamed dm "drivers" subcommand to "compat" (as it listed
> compatibility strings) and prevent it from segfaulting when
> drivers have no of_match populated.
> 
> Added a new "drivers" subcommand to dump a list of all known DM
> drivers and for each, their uclass id, uclass driver and names of
> attached devices.
> 
> Added a new "static" subcommand to dump a list of DM drivers with
> statically defined platform data.
> 
> Signed-off-by: Niel Fourie <lusus at denx.de>
> CC: Simon Glass <sjg at chromium.org>
> CC: Sean Anderson <seanga2 at gmail.com>
> ---
> Depends on: https://patchwork.ozlabs.org/patch/1234460/
> 
> Changes in v2:
> - Add/extend Python tests
> - Fixed minor formatting/typographical errors
> 
>  cmd/dm.c                 | 22 +++++++++++++++-
>  drivers/core/dump.c      | 55 +++++++++++++++++++++++++++++++++++++++-
>  include/dm/util.h        |  6 +++++
>  test/py/tests/test_dm.py | 22 ++++++++++++++--
>  4 files changed, 101 insertions(+), 4 deletions(-)
> 
> diff --git a/cmd/dm.c b/cmd/dm.c
> index 7a90685f8b..fa7eba6a17 100644
> --- a/cmd/dm.c
> +++ b/cmd/dm.c
> @@ -48,11 +48,29 @@ static int do_dm_dump_drivers(cmd_tbl_t *cmdtp, int flag, int argc,
>  	return 0;
>  }
>  
> +static int do_dm_dump_driver_compat(cmd_tbl_t *cmdtp, int flag, int argc,
> +				    char * const argv[])
> +{
> +	dm_dump_driver_compat();
> +
> +	return 0;
> +}
> +
> +static int do_dm_dump_static_driver_info(cmd_tbl_t *cmdtp, int flag, int argc,
> +					 char * const argv[])
> +{
> +	dm_dump_static_driver_info();
> +
> +	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, "", ""),
> +	U_BOOT_CMD_MKENT(compat, 1, 1, do_dm_dump_driver_compat, "", ""),
> +	U_BOOT_CMD_MKENT(static, 1, 1, do_dm_dump_static_driver_info, "", ""),
>  };
>  
>  static __maybe_unused void dm_reloc(void)
> @@ -94,5 +112,7 @@ U_BOOT_CMD(
>  	"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\n"
> -	"dm drivers       Dump list of drivers and their compatible strings"
> +	"dm drivers       Dump list of drivers with uclass and instances\n"
> +	"dm compat        Dump list of drivers with compatibility strings\n"
> +	"dm static        Dump list of drivers with static platform data"
>  );
> diff --git a/drivers/core/dump.c b/drivers/core/dump.c
> index b5046398d4..e96d59f861 100644
> --- a/drivers/core/dump.c
> +++ b/drivers/core/dump.c
> @@ -97,7 +97,7 @@ void dm_dump_uclass(void)
>  	}
>  }
>  
> -void dm_dump_drivers(void)
> +void dm_dump_driver_compat(void)
>  {
>  	struct driver *d = ll_entry_start(struct driver, driver);
>  	const int n_ents = ll_entry_count(struct driver, driver);
> @@ -116,3 +116,56 @@ void dm_dump_drivers(void)
>  			printf("%-20.20s\n", entry->name);
>  	}
>  }
> +
> +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;
> +	struct udevice *udev;
> +	struct uclass *uc;
> +	int i;
> +
> +	puts("Driver                    uid uclass               Devices\n");
> +	puts("----------------------------------------------------------\n");
> +
> +	for (entry = d; entry < d + n_ents; entry++) {
> +		uclass_get(entry->id, &uc);
> +
> +		printf("%-25.25s %-3.3d %-20.20s ", entry->name, entry->id,
> +		       uc ? uc->uc_drv->name : "<no uclass>");
> +
> +		if (!uc) {
> +			puts("\n");
> +			continue;
> +		}
> +
> +		i = 0;
> +		uclass_foreach_dev(udev, uc) {
> +			if (udev->driver != entry)
> +				continue;
> +			if (i)
> +				printf("%-51.51s", "");
> +
> +			printf("%-25.25s\n", udev->name);
> +			i++;
> +		}
> +		if (!i)
> +			puts("<none>\n");
> +	}
> +}
> +
> +void dm_dump_static_driver_info(void)
> +{
> +	struct driver_info *drv = ll_entry_start(struct driver_info,
> +						 driver_info);
> +	const int n_ents = ll_entry_count(struct driver_info, driver_info);
> +	struct driver_info *entry;
> +
> +	puts("Driver                    Address\n");
> +	puts("---------------------------------\n");
> +	for (entry = drv; entry != drv + n_ents; entry++) {
> +		printf("%-25.25s @%08lx\n", entry->name,
> +		       (ulong)map_to_sysmem(entry->platdata));
> +	}
> +}
> diff --git a/include/dm/util.h b/include/dm/util.h
> index 0ccb3fbadf..974347ce0b 100644
> --- a/include/dm/util.h
> +++ b/include/dm/util.h
> @@ -42,6 +42,12 @@ static inline void dm_dump_devres(void)
>  /* Dump out a list of drivers */
>  void dm_dump_drivers(void);
>  
> +/* Dump out a list with each driver's compatibility strings */
> +void dm_dump_driver_compat(void);
> +
> +/* Dump out a list of drivers with static platform data */
> +void dm_dump_static_driver_info(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
> index f6fbf8ba4c..97203b536e 100644
> --- a/test/py/tests/test_dm.py
> +++ b/test/py/tests/test_dm.py
> @@ -4,14 +4,32 @@
>  import pytest
>  
>  @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`."""
> +def test_dm_compat(u_boot_console):
> +    """Test that each driver in `dm tree` is also listed in `dm compat`."""
>      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 compat')
> +    for driver in drivers:
> +        assert driver in response
> +

Why is the above marked as being added? These lines are present in the
patch which adds the original test.

> + at pytest.mark.buildconfigspec('cmd_dm')
> +def test_dm_drivers(u_boot_console):
> +    """Test that each driver in `dm compat` is also listed in `dm drivers`."""
> +    response = u_boot_console.run_command('dm compat')
> +    drivers = (line[:20].rstrip() for line in response[:-1].split('\n')[2:])
> +    response = u_boot_console.run_command('dm drivers')
> +    for driver in drivers:
> +        assert driver in response
> +
> + at pytest.mark.buildconfigspec('cmd_dm')
> +def test_dm_static(u_boot_console):
> +    """Test that each driver in `dm static` is also listed in `dm drivers`."""
> +    response = u_boot_console.run_command('dm static')
> +    drivers = (line[:25].rstrip() for line in response[:-1].split('\n')[2:])
>      response = u_boot_console.run_command('dm drivers')
>      for driver in drivers:
>          assert driver in response
> 

--Sean
Niel Fourie March 20, 2020, 9:53 a.m. UTC | #2
Hi Sean,

On 3/19/20 7:37 PM, Sean Anderson wrote:
<snip>
>> diff --git a/test/py/tests/test_dm.py b/test/py/tests/test_dm.py
>> index f6fbf8ba4c..97203b536e 100644
>> --- a/test/py/tests/test_dm.py
>> +++ b/test/py/tests/test_dm.py
>> @@ -4,14 +4,32 @@
>>   import pytest
>>   
>>   @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`."""
>> +def test_dm_compat(u_boot_console):
>> +    """Test that each driver in `dm tree` is also listed in `dm compat`."""
>>       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 compat')
>> +    for driver in drivers:
>> +        assert driver in response
>> +
> 
> Why is the above marked as being added? These lines are present in the
> patch which adds the original test.
> 

Well spotted! I had to give it a second look before I grasped what 
happened there... My tests were all based on yours, and it turns out 
that the last 4 lines of my last test, test_dm_static(), exactly matches 
those 4 lines in your original patch. And as I had changed the command 
to run in your test from "dm driver" to "dm compat", git decided to just 
insert all of my changes in one block in the middle of what was 
originally your test. At the bottom of the patch you can still see your 
original code:

+ at pytest.mark.buildconfigspec('cmd_dm')
+def test_dm_static(u_boot_console):
+    """Test that each driver in `dm static` is also listed in `dm 
drivers`."""
+    response = u_boot_console.run_command('dm static')
+    drivers = (line[:25].rstrip() for line in 
response[:-1].split('\n')[2:])
      response = u_boot_console.run_command('dm drivers')
      for driver in drivers:
          assert driver in response

Best regards,
Niel Fourie
Simon Glass March 23, 2020, 3:37 p.m. UTC | #3
On Thu, 19 Mar 2020 at 10:14, Niel Fourie <lusus at denx.de> wrote:
>
> Renamed dm "drivers" subcommand to "compat" (as it listed
> compatibility strings) and prevent it from segfaulting when
> drivers have no of_match populated.
>
> Added a new "drivers" subcommand to dump a list of all known DM
> drivers and for each, their uclass id, uclass driver and names of
> attached devices.
>
> Added a new "static" subcommand to dump a list of DM drivers with
> statically defined platform data.
>
> Signed-off-by: Niel Fourie <lusus at denx.de>
> CC: Simon Glass <sjg at chromium.org>
> CC: Sean Anderson <seanga2 at gmail.com>
> ---
> Depends on: https://patchwork.ozlabs.org/patch/1234460/
>
> Changes in v2:
> - Add/extend Python tests
> - Fixed minor formatting/typographical errors
>
>  cmd/dm.c                 | 22 +++++++++++++++-
>  drivers/core/dump.c      | 55 +++++++++++++++++++++++++++++++++++++++-
>  include/dm/util.h        |  6 +++++
>  test/py/tests/test_dm.py | 22 ++++++++++++++--
>  4 files changed, 101 insertions(+), 4 deletions(-)

Reviewed-by: Simon Glass <sjg at chromium.org>

I'm not quite sold on the name 'static' here, but I suppose it makes sense.
diff mbox series

Patch

diff --git a/cmd/dm.c b/cmd/dm.c
index 7a90685f8b..fa7eba6a17 100644
--- a/cmd/dm.c
+++ b/cmd/dm.c
@@ -48,11 +48,29 @@  static int do_dm_dump_drivers(cmd_tbl_t *cmdtp, int flag, int argc,
 	return 0;
 }
 
+static int do_dm_dump_driver_compat(cmd_tbl_t *cmdtp, int flag, int argc,
+				    char * const argv[])
+{
+	dm_dump_driver_compat();
+
+	return 0;
+}
+
+static int do_dm_dump_static_driver_info(cmd_tbl_t *cmdtp, int flag, int argc,
+					 char * const argv[])
+{
+	dm_dump_static_driver_info();
+
+	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, "", ""),
+	U_BOOT_CMD_MKENT(compat, 1, 1, do_dm_dump_driver_compat, "", ""),
+	U_BOOT_CMD_MKENT(static, 1, 1, do_dm_dump_static_driver_info, "", ""),
 };
 
 static __maybe_unused void dm_reloc(void)
@@ -94,5 +112,7 @@  U_BOOT_CMD(
 	"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\n"
-	"dm drivers       Dump list of drivers and their compatible strings"
+	"dm drivers       Dump list of drivers with uclass and instances\n"
+	"dm compat        Dump list of drivers with compatibility strings\n"
+	"dm static        Dump list of drivers with static platform data"
 );
diff --git a/drivers/core/dump.c b/drivers/core/dump.c
index b5046398d4..e96d59f861 100644
--- a/drivers/core/dump.c
+++ b/drivers/core/dump.c
@@ -97,7 +97,7 @@  void dm_dump_uclass(void)
 	}
 }
 
-void dm_dump_drivers(void)
+void dm_dump_driver_compat(void)
 {
 	struct driver *d = ll_entry_start(struct driver, driver);
 	const int n_ents = ll_entry_count(struct driver, driver);
@@ -116,3 +116,56 @@  void dm_dump_drivers(void)
 			printf("%-20.20s\n", entry->name);
 	}
 }
+
+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;
+	struct udevice *udev;
+	struct uclass *uc;
+	int i;
+
+	puts("Driver                    uid uclass               Devices\n");
+	puts("----------------------------------------------------------\n");
+
+	for (entry = d; entry < d + n_ents; entry++) {
+		uclass_get(entry->id, &uc);
+
+		printf("%-25.25s %-3.3d %-20.20s ", entry->name, entry->id,
+		       uc ? uc->uc_drv->name : "<no uclass>");
+
+		if (!uc) {
+			puts("\n");
+			continue;
+		}
+
+		i = 0;
+		uclass_foreach_dev(udev, uc) {
+			if (udev->driver != entry)
+				continue;
+			if (i)
+				printf("%-51.51s", "");
+
+			printf("%-25.25s\n", udev->name);
+			i++;
+		}
+		if (!i)
+			puts("<none>\n");
+	}
+}
+
+void dm_dump_static_driver_info(void)
+{
+	struct driver_info *drv = ll_entry_start(struct driver_info,
+						 driver_info);
+	const int n_ents = ll_entry_count(struct driver_info, driver_info);
+	struct driver_info *entry;
+
+	puts("Driver                    Address\n");
+	puts("---------------------------------\n");
+	for (entry = drv; entry != drv + n_ents; entry++) {
+		printf("%-25.25s @%08lx\n", entry->name,
+		       (ulong)map_to_sysmem(entry->platdata));
+	}
+}
diff --git a/include/dm/util.h b/include/dm/util.h
index 0ccb3fbadf..974347ce0b 100644
--- a/include/dm/util.h
+++ b/include/dm/util.h
@@ -42,6 +42,12 @@  static inline void dm_dump_devres(void)
 /* Dump out a list of drivers */
 void dm_dump_drivers(void);
 
+/* Dump out a list with each driver's compatibility strings */
+void dm_dump_driver_compat(void);
+
+/* Dump out a list of drivers with static platform data */
+void dm_dump_static_driver_info(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
index f6fbf8ba4c..97203b536e 100644
--- a/test/py/tests/test_dm.py
+++ b/test/py/tests/test_dm.py
@@ -4,14 +4,32 @@ 
 import pytest
 
 @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`."""
+def test_dm_compat(u_boot_console):
+    """Test that each driver in `dm tree` is also listed in `dm compat`."""
     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 compat')
+    for driver in drivers:
+        assert driver in response
+
+ at pytest.mark.buildconfigspec('cmd_dm')
+def test_dm_drivers(u_boot_console):
+    """Test that each driver in `dm compat` is also listed in `dm drivers`."""
+    response = u_boot_console.run_command('dm compat')
+    drivers = (line[:20].rstrip() for line in response[:-1].split('\n')[2:])
+    response = u_boot_console.run_command('dm drivers')
+    for driver in drivers:
+        assert driver in response
+
+ at pytest.mark.buildconfigspec('cmd_dm')
+def test_dm_static(u_boot_console):
+    """Test that each driver in `dm static` is also listed in `dm drivers`."""
+    response = u_boot_console.run_command('dm static')
+    drivers = (line[:25].rstrip() for line in response[:-1].split('\n')[2:])
     response = u_boot_console.run_command('dm drivers')
     for driver in drivers:
         assert driver in response