[PATCH 01/10] dtoc: add support to scan drivers
Walter Lozano
walter.lozano at collabora.com
Thu Jun 11 19:11:47 CEST 2020
Hi Simon
On 11/6/20 13:45, Simon Glass wrote:
> Hi Walter,
>
> On Mon, 8 Jun 2020 at 09:49, Walter Lozano <walter.lozano at collabora.com> wrote:
>> Hi Simon,
>>
>> On 4/6/20 12:59, Simon Glass wrote:
>>> Hi Walter,
>>>
>>> On Fri, 29 May 2020 at 12:15, Walter Lozano <walter.lozano at collabora.com> wrote:
>>>> Currently dtoc scans dtbs to convert them to struct platdata and
>>>> to generate U_BOOT_DEVICE entries. These entries need to be filled
>>>> with the driver name, but at this moment the information used is the
>>>> compatible name present in the dtb. This causes that only nodes with
>>>> a compatible name that matches a driver name generate a working
>>>> entry.
>>>>
>>>> In order to improve this behaviour, this patch adds to dtoc the
>>>> capability of scan drivers source code to generate a list of valid driver
>>>> names. This allows to rise a warning in the case that an U_BOOT_DEVICE
>>>> entry will try to use a name not valid.
>>>>
>>>> Additionally, in order to add more flexibility to the solution, adds the
>>>> U_BOOT_DRIVER_ALIAS macro, which generates no code at all, but allows an
>>>> easy way to declare driver name aliases. Thanks to this, dtoc can look
>>>> for the driver name based on its alias when it populates the U_BOOT_DEVICE
>>>> entry.
>>>>
>>>> Signed-off-by: Walter Lozano <walter.lozano at collabora.com>
>>>> ---
>>>> include/dm/device.h | 7 ++++
>>>> tools/dtoc/dtb_platdata.py | 83 ++++++++++++++++++++++++++++++++++++--
>>>> 2 files changed, 86 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/include/dm/device.h b/include/dm/device.h
>>>> index 975eec5d0e..2cfe10766f 100644
>>>> --- a/include/dm/device.h
>>>> +++ b/include/dm/device.h
>>>> @@ -282,6 +282,13 @@ struct driver {
>>>> #define DM_GET_DRIVER(__name) \
>>>> ll_entry_get(struct driver, __name, driver)
>>>>
>>>> +/**
>>>> + * Declare a macro to state a alias for a driver name. This macro will
>>>> + * produce no code but its information will be parsed by tools like
>>>> + * dtoc
>>>> + */
>>>> +#define U_BOOT_DRIVER_ALIAS(__name, __alias)
>>>> +
>>>> /**
>>>> * dev_get_platdata() - Get the platform data for a device
>>>> *
>>>> diff --git a/tools/dtoc/dtb_platdata.py b/tools/dtoc/dtb_platdata.py
>>>> index ecfe0624d1..23cfda2f88 100644
>>>> --- a/tools/dtoc/dtb_platdata.py
>>>> +++ b/tools/dtoc/dtb_platdata.py
>>>> @@ -13,6 +13,8 @@ static data.
>>>>
>>>> import collections
>>>> import copy
>>>> +import os
>>>> +import re
>>>> import sys
>>>>
>>>> from dtoc import fdt
>>>> @@ -140,6 +142,9 @@ class DtbPlatdata(object):
>>>> _include_disabled: true to include nodes marked status = "disabled"
>>>> _outfile: The current output file (sys.stdout or a real file)
>>>> _lines: Stashed list of output lines for outputting in the future
>>>> + _aliases: Dict that hold aliases for compatible strings
>>> key: The driver name, i.e. the part between brackets in U_BOOT_DRIVER(xx) ??
>>> value: ...
>> Noted.
>>>> + _drivers: List of valid driver names found in drivers/
>>>> + _driver_aliases: Dict that holds aliases for driver names
>>> key:
>>> vaue:
>> OK.
>>>> """
>>>> def __init__(self, dtb_fname, include_disabled):
>>>> self._fdt = None
>>>> @@ -149,6 +154,35 @@ class DtbPlatdata(object):
>>>> self._outfile = None
>>>> self._lines = []
>>>> self._aliases = {}
>>>> + self._drivers = []
>>>> + self._driver_aliases = {}
>>>> +
>>>> + def get_normalized_compat_name(self, node):
>>>> + """Get a node's normalized compat name
>>>> +
>>>> + Returns a valid driver name by retrieving node's first compatible
>>>> + string as a C identifier and perfomrming a check against _drivers
>>> performing
>> Noted.
>>>> + and a lookup in driver_aliases rising a warning in case of failure.
>>> s/ rising/, printing/
>> OK.
>>>> +
>>>> + Args:
>>>> + node: Node object to check
>>>> + Return:
>>>> + Tuple:
>>>> + Driver name associated with the first compatible string
>>>> + List of C identifiers for all the other compatible strings
>>>> + (possibly empty)
>>> Can you update this comment to explain what is returned when it is not found?
>> Sure.
>>>> + """
>>>> + compat_c, aliases_c = get_compat_name(node)
>>>> + if compat_c not in self._drivers:
>>>> + compat_c_old = compat_c
>>>> + compat_c = self._driver_aliases.get(compat_c)
>>>> + if not compat_c:
>>>> + print('WARNING: the driver %s was not found in the driver list' % (compat_c_old))
>>> This creates lots of warnings at present. Either we need a patch to
>>> clean up the differences in the source code, or we need to disable the
>>> warning.
>>
>> Regarding this, maybe we should have a list of driver names we don't
>> expect to support, like simple_bus. For this to work probably the best
>> approach is to have a config option similar to CONFIG_OF_REMOVE_PROPS,
>> so each config can add their owns.
> Or perhaps have another macro in the source code that indicates that
> the driver cannot be used with of-platdata and should be ignored?
I don't fully understand your idea. As I see, the warning should help to
spot that you will be trying to create a U_BOOT_DEVICE without a proper
driver name, which means that compatible string does not match a driver
name. The most probably reason for this is that driver doesn't fully
support of-platdata, or at least an U_BOOT_DRIVER_ALIAS is missing.
From my understanding by adding a another macro to indicate that a
driver cannot be used, or even better to add a macro which tells that a
driver supports of-platdata, will give us a cleaner dt-struct, which
will be nice, however my first sentence still makes sense.
Could you clarify?
Also I have mentioned
> > I've been thinking about this issue, I think it would be better to only
> > print the warning if build is issue with
> >
> > make V=1
> >
> > What do you think?
> Can we not fix the warnings?
So it is not clear to me which idea is better from your point if view.
Regards,
Walter
More information about the U-Boot
mailing list