dtoc: look for compatible string aliases in driver list

Currently dtoc checks if the first compatible string in a dtb node
matches either a driver o driver alias name, without taking into account
any other compatible string in the list. In the case that no driver matches
the first compatible string a warning is printed and the U_BOOT_DEVICE is
not being declared correctly.

This patch adds dtoc's support for try all the compatible strings in the
dtb node, in an effort to find the correct driver.

Signed-off-by: Walter Lozano <walter.lozano@collabora.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Walter Lozano 2020-07-23 00:22:03 -03:00 committed by Simon Glass
parent 6e31458435
commit dcb3ed642b
3 changed files with 44 additions and 26 deletions

View file

@ -113,21 +113,17 @@ def get_value(ftype, value):
return '%#x' % value
def get_compat_name(node):
"""Get a node's first compatible string as a C identifier
"""Get the node's list of compatible string as a C identifiers
Args:
node: Node object to check
Return:
Tuple:
C identifier for the first compatible string
List of C identifiers for all the other compatible strings
(possibly empty)
List of C identifiers for all the compatible strings
"""
compat = node.props['compatible'].value
aliases = []
if isinstance(compat, list):
compat, aliases = compat[0], compat[1:]
return conv_name_to_c(compat), [conv_name_to_c(a) for a in aliases]
if not isinstance(compat, list):
compat = [compat]
return [conv_name_to_c(c) for c in compat]
class DtbPlatdata(object):
@ -174,7 +170,7 @@ class DtbPlatdata(object):
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
Returns a valid driver name by retrieving node's list of compatible
string as a C identifier and performing a check against _drivers
and a lookup in driver_aliases printing a warning in case of failure.
@ -188,19 +184,24 @@ class DtbPlatdata(object):
In case of no match found, the return will be the same as
get_compat_name()
"""
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:
if not self._warning_disabled:
print('WARNING: the driver %s was not found in the driver list'
% (compat_c_old))
compat_c = compat_c_old
else:
aliases_c = [compat_c_old] + aliases_c
compat_list_c = get_compat_name(node)
return compat_c, aliases_c
for compat_c in compat_list_c:
if not compat_c in self._drivers:
compat_c = self._driver_aliases.get(compat_c)
if not compat_c:
continue
aliases_c = compat_list_c
if compat_c in aliases_c:
aliases_c.remove(compat_c)
return compat_c, aliases_c
if not self._warning_disabled:
print('WARNING: the driver %s was not found in the driver list'
% (compat_list_c[0]))
return compat_list_c[0], compat_list_c[1:]
def setup_output(self, fname):
"""Set up the output destination

View file

@ -14,4 +14,9 @@
intval = <1>;
};
spl-test2 {
u-boot,dm-pre-reloc;
compatible = "compat1", "simple_bus";
intval = <1>;
};
};

View file

@ -146,18 +146,18 @@ class TestDtoc(unittest.TestCase):
prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1'])
node = Node({'compatible': prop})
self.assertEqual(('rockchip_rk3399_sdhci_5_1', ['arasan_sdhci_5_1']),
self.assertEqual((['rockchip_rk3399_sdhci_5_1', 'arasan_sdhci_5_1']),
get_compat_name(node))
prop = Prop(['rockchip,rk3399-sdhci-5.1'])
node = Node({'compatible': prop})
self.assertEqual(('rockchip_rk3399_sdhci_5_1', []),
self.assertEqual((['rockchip_rk3399_sdhci_5_1']),
get_compat_name(node))
prop = Prop(['rockchip,rk3399-sdhci-5.1', 'arasan,sdhci-5.1', 'third'])
node = Node({'compatible': prop})
self.assertEqual(('rockchip_rk3399_sdhci_5_1',
['arasan_sdhci_5_1', 'third']),
self.assertEqual((['rockchip_rk3399_sdhci_5_1',
'arasan_sdhci_5_1', 'third']),
get_compat_name(node))
def test_empty_file(self):
@ -570,6 +570,9 @@ void dm_populate_phandle_data(void) {
struct dtd_compat1 {
\tfdt32_t\t\tintval;
};
struct dtd_simple_bus {
\tfdt32_t\t\tintval;
};
#define dtd_compat2_1_fred dtd_compat1
#define dtd_compat3 dtd_compat1
''', data)
@ -587,6 +590,15 @@ U_BOOT_DEVICE(spl_test) = {
\t.platdata_size\t= sizeof(dtv_spl_test),
};
static struct dtd_simple_bus dtv_spl_test2 = {
\t.intval\t\t\t= 0x1,
};
U_BOOT_DEVICE(spl_test2) = {
\t.name\t\t= "simple_bus",
\t.platdata\t= &dtv_spl_test2,
\t.platdata_size\t= sizeof(dtv_spl_test2),
};
''' + C_EMPTY_POPULATE_PHANDLE_DATA, data)
def test_addresses64(self):