dtc: Correct invalid dts output with mixed phandles and integers

The handling of "type preservation" dts output is based on the idea of
"phandles with arguments" in properties, which isn't really a thing, other
than a fairly common convention about how bindings are written.  There's
nothing preventing a binding which freely mixes phandles and other integers
in an array of cells.

Currently write_propval() handles this incorrectly: specifically the case
of a phandle which follows a regular integer in a 32-bit cell array, but
without a new '< >' delimited causing an extra TYPE_UINT32 marker to be
inserted.  In this case it omits the necessary space between the integer
and the phandle reference, leading to output which can't be sent back into
dtc and parsed.

Correct this, and update tests to match.  I think this is more or less
correct for now, but really write_propval() is a big mess :(.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
main
David Gibson 2023-05-14 16:27:27 +10:00
parent d4888958d6
commit 3b02a94b48
3 changed files with 4 additions and 0 deletions

View File

@ -15,6 +15,7 @@
a-string-with-nulls: ["foo\0bar", "baz"]
a-phandle: [[!phandle 0x1]]
a-phandle-with-args: [[!phandle 0x1, 0x0, 0x1], [!phandle 0x1, 0x2, 0x3]]
mixed-ints-and-phandles: [[0x1, !phandle 0x1, 0x2, !phandle 0x1]]
subsubnode:
compatible: ["subsubnode1", "subsubnode"]
phandle: [[0x1]]

View File

@ -18,6 +18,7 @@
a-string-with-nulls = "foo\0bar", "baz";
a-phandle = <&subsub1>;
a-phandle-with-args = <&subsub1 0x00 0x01>, <&subsub1 0x02 0x03>;
mixed-ints-and-phandles = <0x01 &subsub1 0x02 &subsub1>;

subsub1: subsubnode {
compatible = "subsubnode1", "subsubnode";

View File

@ -241,6 +241,8 @@ static void write_propval(FILE *f, struct property *prop)
} else {
write_propval_int(f, p, chunk_len, 4);
}
if (data_len > chunk_len)
fputc(' ', f);
break;
case TYPE_UINT64:
write_propval_int(f, p, chunk_len, 8);