All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: u-boot@lists.denx.de
Subject: [PATCH v2 23/33] dtoc: Support processing the root node
Date: Wed,  3 Feb 2021 06:01:11 -0700	[thread overview]
Message-ID: <20210203130121.2478810-24-sjg@chromium.org> (raw)
In-Reply-To: <20210203130121.2478810-1-sjg@chromium.org>

The device for the root node is normally bound by driver model on init.
With devices being instantiated at build time, we must handle the root
device also.

Add support for processing the root node, which may not have a compatible
string.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 tools/dtoc/dtb_platdata.py  | 10 ++++++++--
 tools/dtoc/src_scan.py      | 39 ++++++++++++++++++++++---------------
 tools/dtoc/test_dtoc.py     | 23 ++++++++++++++++++++--
 tools/dtoc/test_src_scan.py |  7 +++++++
 4 files changed, 59 insertions(+), 20 deletions(-)

diff --git a/tools/dtoc/dtb_platdata.py b/tools/dtoc/dtb_platdata.py
index af21156659b..e08b92cf8a3 100644
--- a/tools/dtoc/dtb_platdata.py
+++ b/tools/dtoc/dtb_platdata.py
@@ -350,16 +350,22 @@ class DtbPlatdata():
             # recurse to handle any subnodes
             self.scan_node(subnode, valid_nodes)
 
-    def scan_tree(self):
+    def scan_tree(self, add_root):
         """Scan the device tree for useful information
 
         This fills in the following properties:
             _valid_nodes_unsorted: A list of nodes we wish to consider include
                 in the platform data (in devicetree node order)
             _valid_nodes: Sorted version of _valid_nodes_unsorted
+
+        Args:
+            add_root: True to add the root node also (which wouldn't normally
+                be added as it may not have a compatible string)
         """
         root = self._fdt.GetRoot()
         valid_nodes = []
+        if add_root:
+            valid_nodes.append(root)
         self.scan_node(root, valid_nodes)
         self._valid_nodes_unsorted = valid_nodes
         self._valid_nodes = sorted(valid_nodes,
@@ -839,7 +845,7 @@ def run_steps(args, dtb_file, include_disabled, output, output_dirs, phase,
         do_process = False
     plat = DtbPlatdata(scan, dtb_file, include_disabled)
     plat.scan_dtb()
-    plat.scan_tree()
+    plat.scan_tree(add_root=False)
     plat.prepare_nodes()
     plat.scan_reg_sizes()
     plat.setup_output_dirs(output_dirs)
diff --git a/tools/dtoc/src_scan.py b/tools/dtoc/src_scan.py
index 8619206a8d4..114212cfe2d 100644
--- a/tools/dtoc/src_scan.py
+++ b/tools/dtoc/src_scan.py
@@ -33,6 +33,8 @@ def conv_name_to_c(name):
     new = new.replace('-', '_')
     new = new.replace(',', '_')
     new = new.replace('.', '_')
+    if new == '/':
+        return 'root'
     return new
 
 def get_compat_name(node):
@@ -250,7 +252,10 @@ class Scanner:
                 In case of no match found, the return will be the same as
                 get_compat_name()
         """
-        compat_list_c = get_compat_name(node)
+        if not node.parent:
+            compat_list_c = ['root_driver']
+        else:
+            compat_list_c = get_compat_name(node)
 
         for compat_c in compat_list_c:
             if not compat_c in self._drivers.keys():
@@ -509,21 +514,23 @@ class Scanner:
                 elif m_hdr:
                     driver.headers.append(m_hdr.group(1))
                 elif '};' in line:
-                    if driver.uclass_id and compat:
-                        if compat not in of_match:
-                            raise ValueError(
-                                "%s: Unknown compatible var '%s' (found: %s)" %
-                                (fname, compat, ','.join(of_match.keys())))
-                        driver.compat = of_match[compat]
-
-                        # This needs to be deterministic, since a driver may
-                        # have multiple compatible strings pointing to it.
-                        # We record the one earliest in the alphabet so it
-                        # will produce the same result on all machines.
-                        for compat_id in of_match[compat]:
-                            old = self._compat_to_driver.get(compat_id)
-                            if not old or driver.name < old.name:
-                                self._compat_to_driver[compat_id] = driver
+                    is_root = driver.name == 'root_driver'
+                    if driver.uclass_id and (compat or is_root):
+                        if not is_root:
+                            if compat not in of_match:
+                                raise ValueError(
+                                    "%s: Unknown compatible var '%s' (found: %s)" %
+                                    (fname, compat, ','.join(of_match.keys())))
+                            driver.compat = of_match[compat]
+
+                            # This needs to be deterministic, since a driver may
+                            # have multiple compatible strings pointing to it.
+                            # We record the one earliest in the alphabet so it
+                            # will produce the same result on all machines.
+                            for compat_id in of_match[compat]:
+                                old = self._compat_to_driver.get(compat_id)
+                                if not old or driver.name < old.name:
+                                    self._compat_to_driver[compat_id] = driver
                         drivers[driver.name] = driver
                     else:
                         # The driver does not have a uclass or compat string.
diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py
index b077cf0e76d..ed8c7e47882 100755
--- a/tools/dtoc/test_dtoc.py
+++ b/tools/dtoc/test_dtoc.py
@@ -974,10 +974,10 @@ U_BOOT_DRVINFO(spl_test2) = {
         output = tools.GetOutputFilename('output')
 
         # Take a copy before messing with it
-        scan = copy.deepcopy(saved_scan)
+        scan = copy_scan()
         plat = dtb_platdata.DtbPlatdata(scan, dtb_file, False)
         plat.scan_dtb()
-        plat.scan_tree()
+        plat.scan_tree(False)
         plat.prepare_nodes()
         return plat, scan
 
@@ -1123,3 +1123,22 @@ U_BOOT_DRVINFO(spl_test2) = {
         self.assertEqual(4, i2c.seq)
         spl = plat._fdt.GetNode('/spl-test')
         self.assertEqual(0, spl.seq)
+
+    def test_process_root(self):
+        """Test assignment of sequence numnbers"""
+        dtb_file = get_dtb_file('dtoc_test_simple.dts')
+        output = tools.GetOutputFilename('output')
+
+        # Take a copy before messing with it
+        scan = copy_scan()
+        plat = dtb_platdata.DtbPlatdata(scan, dtb_file, False)
+        plat.scan_dtb()
+        root = plat._fdt.GetRoot()
+
+        plat.scan_tree(False)
+        self.assertNotIn(root, plat._valid_nodes)
+
+        plat.scan_tree(True)
+        self.assertIn(root, plat._valid_nodes)
+        self.assertEqual('root_driver',
+                         scan.get_normalized_compat_name(root)[0])
diff --git a/tools/dtoc/test_src_scan.py b/tools/dtoc/test_src_scan.py
index d32aa58400f..0af86dcf0c3 100644
--- a/tools/dtoc/test_src_scan.py
+++ b/tools/dtoc/test_src_scan.py
@@ -161,6 +161,10 @@ class TestSrcScan(unittest.TestCase):
         prop.value = 'rockchip,rk3288-grf'
         node = FakeNode()
         node.props = {'compatible': prop}
+
+        # get_normalized_compat_name() uses this to check for root node
+        node.parent = FakeNode()
+
         scan = src_scan.Scanner(None, False, None)
         with test_util.capture_sys_output() as (stdout, _):
             name, aliases = scan.get_normalized_compat_name(node)
@@ -419,6 +423,9 @@ U_BOOT_DRIVER(%s) = {
         node.name = 'testing'
         node.props = {'compatible': prop}
 
+        # get_normalized_compat_name() uses this to check for root node
+        node.parent = FakeNode()
+
         return scan, drv1, driver2, node
 
     def test_dup_drivers(self):
-- 
2.30.0.365.g02bc693789-goog

  parent reply	other threads:[~2021-02-03 13:01 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-03 13:00 [PATCH v2 00/33] dm: Add dtoc implementation of device instantiation (part D) Simon Glass
2021-02-03 13:00 ` [PATCH v2 01/33] bootstage: Fix dependency for BOOTSTAGE_RECORD_COUNT Simon Glass
2021-02-03 13:00 ` [PATCH v2 02/33] dtoc: Scan drivers for available information Simon Glass
2021-02-03 13:00 ` [PATCH v2 03/33] dtoc: Save scan information across test runs Simon Glass
2021-02-03 13:00 ` [PATCH v2 04/33] dtoc: Ignore unwanted files when scanning for drivers Simon Glass
2021-02-03 13:00 ` [PATCH v2 05/33] dtoc: Collect priv/plat struct info from drivers Simon Glass
2021-02-03 13:00 ` [PATCH v2 06/33] dtoc: Support scanning of uclasses Simon Glass
2021-02-03 13:00 ` [PATCH v2 07/33] dtoc: Support scanning of structs in header files Simon Glass
2021-02-03 13:00 ` [PATCH v2 08/33] dtoc: Move test files into a test/ directory Simon Glass
2021-02-03 13:00 ` [PATCH v2 09/33] dtoc: Rename sandbox_i2c_test and sandbox_pmic_test Simon Glass
2021-02-03 13:00 ` [PATCH v2 10/33] dtoc: Add some extra properties to nodes Simon Glass
2021-02-03 13:00 ` [PATCH v2 11/33] dtoc: Make use of node properties Simon Glass
2021-02-03 13:01 ` [PATCH v2 12/33] dtoc: Process nodes to set up required properties Simon Glass
2021-02-03 13:01 ` [PATCH v2 13/33] dtoc: Track nodes which are actually used Simon Glass
2021-02-03 13:01 ` [PATCH v2 14/33] dtoc: Support tracking the phase of U-Boot Simon Glass
2021-02-03 13:01 ` [PATCH v2 15/33] Makefile: Pass the U-Boot phase to dtoc Simon Glass
2021-02-03 13:01 ` [PATCH v2 16/33] dtoc: Support headers needed for drivers Simon Glass
2021-02-03 13:01 ` [PATCH v2 17/33] dtoc: Process driver aliases along with drivers Simon Glass
2021-06-21 18:39   ` Johan Jonker
2021-06-26 18:32     ` Simon Glass
2021-07-04 18:18       ` Simon Glass
2021-02-03 13:01 ` [PATCH v2 18/33] dtoc: Warn of duplicate drivers Simon Glass
2021-02-03 13:01 ` [PATCH v2 19/33] dtoc: Read aliases for uclasses Simon Glass
2021-02-03 13:01 ` [PATCH v2 20/33] dtoc: Detect drivers only at the start of start of line Simon Glass
2021-02-03 13:01 ` [PATCH v2 21/33] dtoc: Assign a sequence number to each node Simon Glass
2021-02-03 13:01 ` [PATCH v2 22/33] dtoc: Set up the uclasses that are used Simon Glass
2021-02-03 13:01 ` Simon Glass [this message]
2021-02-03 13:01 ` [PATCH v2 24/33] dtoc: Add an option for device instantiation Simon Glass
2021-02-03 13:01 ` [PATCH v2 25/33] dm: of-platadata: Add " Simon Glass
2021-02-03 13:01 ` [PATCH v2 26/33] dtoc: Add support for decl file Simon Glass
2021-02-03 13:01 ` [PATCH v2 27/33] dtoc: Don't generate platform data with instantiation Simon Glass
2021-02-03 13:01 ` [PATCH v2 28/33] sandbox: Make sandbox,emul more conventional Simon Glass
2021-02-03 13:01 ` [PATCH v2 29/33] sandbox: i2c: Rename driver names to work with of-platdata Simon Glass
2021-02-03 13:01 ` [PATCH v2 30/33] dtoc: Tidy up the list of supported phandle properties Simon Glass
2021-02-03 13:01 ` [PATCH v2 31/33] dtoc: Generate a summary in the dt-plat.c file Simon Glass
2021-02-03 13:01 ` [PATCH v2 32/33] dtoc: Generate uclass devices Simon Glass
2021-02-03 13:01 ` [PATCH v2 33/33] dtoc: Generate device instances Simon Glass
2021-02-07  0:16 ` Simon Glass
2021-02-07  0:16 ` [PATCH v2 32/33] dtoc: Generate uclass devices Simon Glass
2021-02-07  0:16 ` [PATCH v2 31/33] dtoc: Generate a summary in the dt-plat.c file Simon Glass
2021-02-07  0:16 ` [PATCH v2 30/33] dtoc: Tidy up the list of supported phandle properties Simon Glass
2021-02-07  0:16 ` [PATCH v2 29/33] sandbox: i2c: Rename driver names to work with of-platdata Simon Glass
2021-02-07  0:16 ` [PATCH v2 28/33] sandbox: Make sandbox,emul more conventional Simon Glass
2021-02-07  0:16 ` [PATCH v2 27/33] dtoc: Don't generate platform data with instantiation Simon Glass
2021-02-07  0:16 ` [PATCH v2 26/33] dtoc: Add support for decl file Simon Glass
2021-02-07  0:16 ` [PATCH v2 25/33] dm: of-platadata: Add option for device instantiation Simon Glass
2021-02-07  0:17 ` [PATCH v2 24/33] dtoc: Add an " Simon Glass
2021-02-07  0:17 ` [PATCH v2 23/33] dtoc: Support processing the root node Simon Glass
2021-02-07  0:17 ` [PATCH v2 22/33] dtoc: Set up the uclasses that are used Simon Glass
2021-02-07  0:17 ` [PATCH v2 21/33] dtoc: Assign a sequence number to each node Simon Glass
2021-02-07  0:17 ` [PATCH v2 20/33] dtoc: Detect drivers only at the start of start of line Simon Glass
2021-02-07  0:17 ` [PATCH v2 19/33] dtoc: Read aliases for uclasses Simon Glass
2021-02-07  0:17 ` [PATCH v2 18/33] dtoc: Warn of duplicate drivers Simon Glass
2021-02-07  0:17 ` [PATCH v2 17/33] dtoc: Process driver aliases along with drivers Simon Glass
2021-02-07  0:17 ` [PATCH v2 16/33] dtoc: Support headers needed for drivers Simon Glass
2021-02-07  0:17 ` [PATCH v2 15/33] Makefile: Pass the U-Boot phase to dtoc Simon Glass
2021-02-07  0:17 ` [PATCH v2 14/33] dtoc: Support tracking the phase of U-Boot Simon Glass
2021-02-07  0:17 ` [PATCH v2 13/33] dtoc: Track nodes which are actually used Simon Glass
2021-02-07  0:17 ` [PATCH v2 12/33] dtoc: Process nodes to set up required properties Simon Glass
2021-02-07  0:17 ` [PATCH v2 11/33] dtoc: Make use of node properties Simon Glass
2021-02-07  0:17 ` [PATCH v2 10/33] dtoc: Add some extra properties to nodes Simon Glass
2021-02-07  0:17 ` [PATCH v2 09/33] dtoc: Rename sandbox_i2c_test and sandbox_pmic_test Simon Glass
2021-02-07  0:17 ` [PATCH v2 08/33] dtoc: Move test files into a test/ directory Simon Glass
2021-02-07  0:17 ` [PATCH v2 07/33] dtoc: Support scanning of structs in header files Simon Glass
2021-02-07  0:17 ` [PATCH v2 06/33] dtoc: Support scanning of uclasses Simon Glass
2021-02-07  0:17 ` [PATCH v2 05/33] dtoc: Collect priv/plat struct info from drivers Simon Glass
2021-02-07  0:17 ` [PATCH v2 04/33] dtoc: Ignore unwanted files when scanning for drivers Simon Glass
2021-02-07  0:17 ` [PATCH v2 03/33] dtoc: Save scan information across test runs Simon Glass
2021-02-07  0:17 ` [PATCH v2 02/33] dtoc: Scan drivers for available information Simon Glass
2021-02-07  0:17 ` [PATCH v2 01/33] bootstage: Fix dependency for BOOTSTAGE_RECORD_COUNT Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210203130121.2478810-24-sjg@chromium.org \
    --to=sjg@chromium.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.