diff options
author | Simon Glass <sjg@chromium.org> | 2023-01-12 02:10:18 +0300 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2023-01-19 00:55:41 +0300 |
commit | 8f5afe21aed8b8ed4d75678a4e8972e7d8a23a6b (patch) | |
tree | a28c83d09df5ad37e1cbcddb65daa21dbada467c | |
parent | c1157860c5e9ca45e41859e013ed83919e7397f0 (diff) | |
download | u-boot-8f5afe21aed8b8ed4d75678a4e8972e7d8a23a6b.tar.xz |
dtoc: Add a way to read a phandle with params
Add a function to read a phandle and associated name and offset. This is
useful for binman.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | tools/dtoc/fdt_util.py | 28 | ||||
-rw-r--r-- | tools/dtoc/test/dtoc_test_phandle.dts | 1 | ||||
-rwxr-xr-x | tools/dtoc/test_dtoc.py | 3 | ||||
-rwxr-xr-x | tools/dtoc/test_fdt.py | 11 |
4 files changed, 43 insertions, 0 deletions
diff --git a/tools/dtoc/fdt_util.py b/tools/dtoc/fdt_util.py index d7c38ad1e0..f34316632a 100644 --- a/tools/dtoc/fdt_util.py +++ b/tools/dtoc/fdt_util.py @@ -281,6 +281,34 @@ def GetPhandleList(node, propname): value = [value] return [fdt32_to_cpu(v) for v in value] +def GetPhandleNameOffset(node, propname): + """Get a <&phandle>, "string", <offset> value from a property + + Args: + node: Node object to read from + propname: property name to read + + Returns: + tuple: + Node object + str + int + or None if the property does not exist + """ + prop = node.props.get(propname) + if not prop: + return None + value = prop.bytes + phandle = fdt32_to_cpu(value[:4]) + node = node.GetFdt().LookupPhandle(phandle) + name = '' + for byte in value[4:]: + if not byte: + break + name += chr(byte) + val = fdt32_to_cpu(value[4 + len(name) + 1:]) + return node, name, val + def GetDatatype(node, propname, datatype): """Get a value of a given type from a property diff --git a/tools/dtoc/test/dtoc_test_phandle.dts b/tools/dtoc/test/dtoc_test_phandle.dts index a71acffc69..d9aa433503 100644 --- a/tools/dtoc/test/dtoc_test_phandle.dts +++ b/tools/dtoc/test/dtoc_test_phandle.dts @@ -32,6 +32,7 @@ u-boot,dm-pre-reloc; compatible = "source"; clocks = <&phandle &phandle_1 11 &phandle_2 12 13 &phandle>; + phandle-name-offset = <&phandle_2>, "fred", <123>; }; phandle-source2 { diff --git a/tools/dtoc/test_dtoc.py b/tools/dtoc/test_dtoc.py index 879ca2ab2b..c62fcbac83 100755 --- a/tools/dtoc/test_dtoc.py +++ b/tools/dtoc/test_dtoc.py @@ -929,6 +929,7 @@ U_BOOT_DRVINFO(spl_test) = { self._check_strings(HEADER + ''' struct dtd_source { \tstruct phandle_2_arg clocks[4]; +\tunsigned char phandle_name_offset[13]; }; struct dtd_target { \tfdt32_t\t\tintval; @@ -981,6 +982,8 @@ static struct dtd_source dtv_phandle_source = { \t\t\t{0, {11}}, \t\t\t{1, {12, 13}}, \t\t\t{4, {}},}, +\t.phandle_name_offset = {0x0, 0x0, 0x0, 0x3, 0x66, 0x72, 0x65, 0x64, +\t\t0x0, 0x0, 0x0, 0x0, 0x7b}, }; U_BOOT_DRVINFO(phandle_source) = { \t.name\t\t= "source", diff --git a/tools/dtoc/test_fdt.py b/tools/dtoc/test_fdt.py index a3e36ea363..3b8ee00d4e 100755 --- a/tools/dtoc/test_fdt.py +++ b/tools/dtoc/test_fdt.py @@ -795,6 +795,17 @@ class TestFdtUtil(unittest.TestCase): finally: tools.outdir= old_outdir + def test_get_phandle_name_offset(self): + val = fdt_util.GetPhandleNameOffset(self.node, 'missing') + self.assertIsNone(val) + + dtb = fdt.FdtScan(find_dtb_file('dtoc_test_phandle.dts')) + node = dtb.GetNode('/phandle-source') + node, name, offset = fdt_util.GetPhandleNameOffset(node, + 'phandle-name-offset') + self.assertEqual('phandle3-target', node.name) + self.assertEqual('fred', name) + self.assertEqual(123, offset) def run_test_coverage(build_dir): """Run the tests and check that we get 100% coverage |