From dcb3ed642bce02ea9d7d7ef8a0a6f656f4fc4f2a Mon Sep 17 00:00:00 2001 From: Walter Lozano Date: Thu, 23 Jul 2020 00:22:03 -0300 Subject: [PATCH] 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 Reviewed-by: Simon Glass --- tools/dtoc/dtb_platdata.py | 45 ++++++++++++++++++++-------------------- tools/dtoc/dtoc_test_aliases.dts | 5 +++++ tools/dtoc/test_dtoc.py | 20 ++++++++++++++---- 3 files changed, 44 insertions(+), 26 deletions(-) diff --git a/tools/dtoc/dtb_platdata.py b/tools/dtoc/dtb_platdata.py index 8fdf49f..07f5027 100644 --- a/tools/dtoc/dtb_platdata.py +++ b/tools/dtoc/dtb_platdata.py @@ -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) + + 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_c, aliases_c + return compat_list_c[0], compat_list_c[1:] def setup_output(self, fname): """Set up the output destination diff --git a/tools/dtoc/dtoc_test_aliases.dts b/tools/dtoc/dtoc_test_aliases.dts index e545816..ae33716 100644 --- a/tools/dtoc/dtoc_test_aliases.dts +++ b/tools/dtoc/dtoc_test_aliases.dts @@ -14,4 +14,9 @@ intval = <1>; }; + spl-test2 { + u-boot,dm-pre-reloc; + compatible = "compat1", "simple_bus"; + intval = <1>; + }; }; diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py index a351bd7..f68a15d 100755 --- a/tools/dtoc/test_dtoc.py +++ b/tools/dtoc/test_dtoc.py @@ -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): -- 2.7.4