[PATCH 3/8] dtoc: Allow multiple warnings for a driver

Walter Lozano wlozano at collabora.com
Mon Jul 5 20:04:21 CEST 2021


Hi Simon,

On 7/4/21 3:19 PM, Simon Glass wrote:
> At present we show when a driver is missing but this is not always that
> useful. There are various reasons way a driver may appear to be missing,

Did you mean "why" instead of "way"?

> such as a parse error in the source code or a missing field in the driver
> declaration.
>
> Update the implementation to record all warnings for each driver, showing
> only those which relate to drivers that are actually used. This avoids
> spamming the user with warnings related to a driver for a different board.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>   tools/dtoc/src_scan.py | 24 ++++++++++++++++++++----
>   1 file changed, 20 insertions(+), 4 deletions(-)

Reviewed-by: Walter Lozano <walter.lozano at collabora.com>

Thank you, it is indeed something worth to be added!

Walter

>
> diff --git a/tools/dtoc/src_scan.py b/tools/dtoc/src_scan.py
> index 1dbb56712a3..6c37a71e978 100644
> --- a/tools/dtoc/src_scan.py
> +++ b/tools/dtoc/src_scan.py
> @@ -13,6 +13,7 @@ U_BOOT_DRIVER(), UCLASS_DRIVER and all struct declarations in header files.
>   See doc/driver-model/of-plat.rst for more informaiton
>   """
>   
> +import collections
>   import os
>   import re
>   import sys
> @@ -190,6 +191,9 @@ class Scanner:
>               value: Driver name declared with U_BOOT_DRIVER(driver_name)
>           _drivers_additional (list or str): List of additional drivers to use
>               during scanning
> +        _warnings: Dict of warnings found:
> +            key: Driver name
> +            value: Set of warnings
>           _of_match: Dict holding information about compatible strings
>               key: Name of struct udevice_id variable
>               value: Dict of compatible info in that variable:
> @@ -217,6 +221,7 @@ class Scanner:
>           self._driver_aliases = {}
>           self._drivers_additional = drivers_additional or []
>           self._missing_drivers = set()
> +        self._warnings = collections.defaultdict(set)
>           self._of_match = {}
>           self._compat_to_driver = {}
>           self._uclass = {}
> @@ -267,7 +272,10 @@ class Scanner:
>                   aliases_c.remove(compat_c)
>               return compat_c, aliases_c
>   
> -        self._missing_drivers.add(compat_list_c[0])
> +        name = compat_list_c[0]
> +        self._missing_drivers.add(name)
> +        self._warnings[name].add(
> +            'WARNING: the driver %s was not found in the driver list' % name)
>   
>           return compat_list_c[0], compat_list_c[1:]
>   
> @@ -577,9 +585,17 @@ class Scanner:
>   
>       def show_warnings(self):
>           """Show any warnings that have been collected"""
> -        for name in sorted(list(self._missing_drivers)):
> -            print('WARNING: the driver %s was not found in the driver list'
> -                  % name)
> +        used_drivers = [drv.name for drv in self._drivers.values() if drv.used]
> +        missing = self._missing_drivers
> +        for name in sorted(self._warnings.keys()):
> +            if name in missing or name in used_drivers:
> +                warns = sorted(list(self._warnings[name]))
> +                # For now there is only ever one warning
> +                print('%s: %s' % (name, warns[0]))
> +                indent = ' ' * len(name)
> +                if name in missing:
> +                    missing.remove(name)
> +                print()
>   
>       def scan_driver(self, fname):
>           """Scan a driver file to build a list of driver names and aliases


More information about the U-Boot mailing list