All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] dtoc: improve compatible string aliases support
@ 2020-07-16 20:48 Walter Lozano
  2020-07-16 20:48 ` [PATCH 1/2] dtoc: look for compatible string aliases in driver list Walter Lozano
  2020-07-16 20:48 ` [PATCH 2/2] dtoc: remove compatible string aliases support Walter Lozano
  0 siblings, 2 replies; 3+ messages in thread
From: Walter Lozano @ 2020-07-16 20:48 UTC (permalink / raw)
  To: u-boot


This series adds additional improvements to dtoc, which are focused in
compatible string aliases.

First, enhance dtoc to use not only the first but all the compatible
strings in a dtb node in order to find a valid driver name.

Second, remove compatible string aliases from dtoc which were used to
generate mappings between struct names. This is not longer needed since
now a valid driver name is used.


Walter Lozano (2):
  dtoc: look for compatible string aliases in driver list
  dtoc: remove compatible string aliases support

 tools/dtoc/dtb_platdata.py       | 58 +++++++++++++-------------------
 tools/dtoc/dtoc_test_aliases.dts |  5 +++
 tools/dtoc/test_dtoc.py          | 39 +++------------------
 3 files changed, 32 insertions(+), 70 deletions(-)

-- 
2.20.1

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] dtoc: look for compatible string aliases in driver list
  2020-07-16 20:48 [PATCH 0/2] dtoc: improve compatible string aliases support Walter Lozano
@ 2020-07-16 20:48 ` Walter Lozano
  2020-07-16 20:48 ` [PATCH 2/2] dtoc: remove compatible string aliases support Walter Lozano
  1 sibling, 0 replies; 3+ messages in thread
From: Walter Lozano @ 2020-07-16 20:48 UTC (permalink / raw)
  To: u-boot

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>
---

 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 c148c49625..b1b082e508 100644
--- a/tools/dtoc/dtb_platdata.py
+++ b/tools/dtoc/dtb_platdata.py
@@ -111,21 +111,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):
@@ -169,7 +165,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.
 
@@ -183,19 +179,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 e545816f4e..ae33716863 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 3c8e343b1f..edb3912e94 100755
--- a/tools/dtoc/test_dtoc.py
+++ b/tools/dtoc/test_dtoc.py
@@ -144,18 +144,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):
@@ -566,6 +566,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)
@@ -583,6 +586,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.20.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] dtoc: remove compatible string aliases support
  2020-07-16 20:48 [PATCH 0/2] dtoc: improve compatible string aliases support Walter Lozano
  2020-07-16 20:48 ` [PATCH 1/2] dtoc: look for compatible string aliases in driver list Walter Lozano
@ 2020-07-16 20:48 ` Walter Lozano
  1 sibling, 0 replies; 3+ messages in thread
From: Walter Lozano @ 2020-07-16 20:48 UTC (permalink / raw)
  To: u-boot

After latest improvements in dtoc, compatible strings are checked
against driver and driver alias list to get a valid driver name. With
this new feature the list of compatible string  aliases seems not
useful any more.

Signed-off-by: Walter Lozano <walter.lozano@collabora.com>
---

 tools/dtoc/dtb_platdata.py | 13 ------------
 tools/dtoc/test_dtoc.py    | 43 --------------------------------------
 2 files changed, 56 deletions(-)

diff --git a/tools/dtoc/dtb_platdata.py b/tools/dtoc/dtb_platdata.py
index b1b082e508..c28768f4a2 100644
--- a/tools/dtoc/dtb_platdata.py
+++ b/tools/dtoc/dtb_platdata.py
@@ -139,9 +139,6 @@ class DtbPlatdata(object):
         _outfile: The current output file (sys.stdout or a real file)
         _warning_disabled: true to disable warnings about driver names not found
         _lines: Stashed list of output lines for outputting in the future
-        _aliases: Dict that hold aliases for compatible strings
-            key: First compatible string declared in a node
-            value: List of additional compatible strings declared in a node
         _drivers: List of valid driver names found in drivers/
         _driver_aliases: Dict that holds aliases for driver names
             key: Driver alias declared with
@@ -157,7 +154,6 @@ class DtbPlatdata(object):
         self._outfile = None
         self._warning_disabled = warning_disabled
         self._lines = []
-        self._aliases = {}
         self._drivers = []
         self._driver_aliases = {}
         self._links = []
@@ -483,10 +479,6 @@ class DtbPlatdata(object):
                     prop.Widen(struct[name])
             upto += 1
 
-            struct_name, aliases = self.get_normalized_compat_name(node)
-            for alias in aliases:
-                self._aliases[alias] = struct_name
-
         return structs
 
     def scan_phandles(self):
@@ -549,11 +541,6 @@ class DtbPlatdata(object):
                 self.out(';\n')
             self.out('};\n')
 
-        for alias, struct_name in self._aliases.items():
-            if alias not in sorted(structs):
-                self.out('#define %s%s %s%s\n'% (STRUCT_PREFIX, alias,
-                                                 STRUCT_PREFIX, struct_name))
-
     def output_node(self, node):
         """Output the C code for a node
 
diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py
index edb3912e94..169ecd6e6e 100755
--- a/tools/dtoc/test_dtoc.py
+++ b/tools/dtoc/test_dtoc.py
@@ -290,7 +290,6 @@ struct dtd_sandbox_gpio {
 \tbool\t\tgpio_controller;
 \tfdt32_t\t\tsandbox_gpio_count;
 };
-#define dtd_sandbox_gpio_alias dtd_sandbox_gpio
 ''', data)
 
         self.run_test(['platdata'], dtb_file, output)
@@ -555,48 +554,6 @@ void dm_populate_phandle_data(void) {
         self.assertIn("Node 'phandle-target' has no cells property",
                       str(e.exception))
 
-    def test_aliases(self):
-        """Test output from a node with multiple compatible strings"""
-        dtb_file = get_dtb_file('dtoc_test_aliases.dts')
-        output = tools.GetOutputFilename('output')
-        self.run_test(['struct'], dtb_file, output)
-        with open(output) as infile:
-            data = infile.read()
-        self._CheckStrings(HEADER + '''
-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)
-
-        self.run_test(['platdata'], dtb_file, output)
-        with open(output) as infile:
-            data = infile.read()
-        self._CheckStrings(C_HEADER + '''
-static struct dtd_compat1 dtv_spl_test = {
-\t.intval\t\t\t= 0x1,
-};
-U_BOOT_DEVICE(spl_test) = {
-\t.name\t\t= "compat1",
-\t.platdata\t= &dtv_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):
         """Test output from a node with a 'reg' property with na=2, ns=2"""
         dtb_file = get_dtb_file('dtoc_test_addr64.dts')
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-07-16 20:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-16 20:48 [PATCH 0/2] dtoc: improve compatible string aliases support Walter Lozano
2020-07-16 20:48 ` [PATCH 1/2] dtoc: look for compatible string aliases in driver list Walter Lozano
2020-07-16 20:48 ` [PATCH 2/2] dtoc: remove compatible string aliases support Walter Lozano

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.