[PATCH] dtoc: Check that a parent is not missing

Walter Lozano wlozano at collabora.com
Mon Jul 26 02:43:40 CEST 2021


Hi Simon,

Thanks for the patch, it will be a nice way to spot errors and avoid 
headaches!

On 7/7/21 8:22 AM, Simon Glass wrote:
> With of-platdata-inst we want to set up a reference to each devices'
> parent device, if there is one. If we find that the device has a parent
> (i.e. is not a root node) but it is not in the list of devices being
> written, then we cannot create the reference.
>
> Report an error in this case, since it indicates that the parent node
> is either missing a compatible string, is disabled, or perhaps does not
> have any properties because it was not tagged for SPL.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>   tools/dtoc/dtb_platdata.py             |  9 ++++++++
>   tools/dtoc/test/dtoc_test_noparent.dts | 32 ++++++++++++++++++++++++++
>   tools/dtoc/test_dtoc.py                | 10 ++++++++
>   3 files changed, 51 insertions(+)
>   create mode 100644 tools/dtoc/test/dtoc_test_noparent.dts
>
> diff --git a/tools/dtoc/dtb_platdata.py b/tools/dtoc/dtb_platdata.py
> index 2d42480a9a5..a951a5a2264 100644
> --- a/tools/dtoc/dtb_platdata.py
> +++ b/tools/dtoc/dtb_platdata.py
> @@ -749,6 +749,15 @@ class DtbPlatdata():
>                       break
>   
>           if node.parent and node.parent.parent:
> +            if node.parent not in self._valid_nodes:
> +                # This might indicate that the parent node is not in the
> +                # SPL/TPL devicetree but the child is. For example if we are
> +                # dealing with of-platdata in TPL, the parent has a
> +                # u-boot,dm-spl tag but the child has u-boot,dm-pre-reloc. In
> +                # this case the child node exists in TPL but the parent does
> +                # not.
> +                raise ValueError("Node '%s' requires parent node '%s' but it is not in the valid list" %
> +                                 (node.path, node.parent.path))
>               self.buf('\t.parent\t\t= DM_DEVICE_REF(%s),\n' %
>                        node.parent.var_name)
>           if priv_name:
> diff --git a/tools/dtoc/test/dtoc_test_noparent.dts b/tools/dtoc/test/dtoc_test_noparent.dts
> new file mode 100644
> index 00000000000..5a820301e72
> --- /dev/null
> +++ b/tools/dtoc/test/dtoc_test_noparent.dts
> @@ -0,0 +1,32 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Test device tree file for dtoc
> + *
> + * Copyright 2017 Google, Inc
> + */
> +
> +/dts-v1/;
> +
> +/ {
> +	#address-cells = <1>;
> +	#size-cells = <1>;
> +	i2c at 0 {
> +		compatible = "sandbox,i2c";
> +		u-boot,dm-pre-tpl;

Does u-boot,dm-pre-tpl exists? Probably I'm missing something here but I 
was expecting u-boot,dm-spl.

> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +		spl-test {
> +			u-boot,dm-pre-reloc;
> +			compatible = "sandbox,spl-test";
> +			#address-cells = <1>;
> +			#size-cells = <0>;
> +			status = "disabled";
> +			pmic at 9 {
> +				compatible = "sandbox,pmic";
> +				u-boot,dm-pre-reloc;
> +				reg = <9>;
> +				low-power;
> +			};
> +		};
> +	};
> +};
> diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py
> index 0b2805feed2..863ede90b7a 100755
> --- a/tools/dtoc/test_dtoc.py
> +++ b/tools/dtoc/test_dtoc.py
> @@ -1830,3 +1830,13 @@ U_BOOT_DRVINFO(spl_test2) = {
>           dtb_file = get_dtb_file('dtoc_test_single_reg.dts')
>           output = tools.GetOutputFilename('output')
>           self.run_test(['struct'], dtb_file, output)
> +
> +    def test_missing_parent(self):
> +        """Test detection of a parent node with no properties"""
> +        dtb_file = get_dtb_file('dtoc_test_noparent.dts', capture_stderr=True)
> +        output = tools.GetOutputFilename('output')
> +        with self.assertRaises(ValueError) as exc:
> +            self.run_test(['device'], dtb_file, output, instantiate=True)
> +        self.assertIn("Node '/i2c at 0/spl-test/pmic at 9' requires parent node "
> +                      "'/i2c at 0/spl-test' but it is not in the valid list",
> +                      str(exc.exception))


Regards,

Walter



More information about the U-Boot mailing list