blob: c11c181c807c9b8074260a0a737f13b800506ade [file] [log] [blame]
Simon Glassf3c6a1d2022-07-13 06:06:59 -06001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Tests for fdt command
4 *
Marek Vasutd578efb2023-04-22 14:59:58 +02005 * Copyright 2022 Google LLC
Simon Glassf3c6a1d2022-07-13 06:06:59 -06006 */
7
Simon Glassf3c6a1d2022-07-13 06:06:59 -06008#include <console.h>
9#include <fdt_support.h>
10#include <mapmem.h>
11#include <asm/global_data.h>
12#include <linux/libfdt.h>
Simon Glassf3c6a1d2022-07-13 06:06:59 -060013#include <test/ut.h>
14
15DECLARE_GLOBAL_DATA_PTR;
Marek Vasutf2def362023-03-02 04:08:45 +010016/*
17 * Missing tests:
18 * fdt boardsetup - Do board-specific set up
19 * fdt checksign [<addr>] - check FIT signature
20 * <addr> - address of key blob
21 * default gd->fdt_blob
22 */
Simon Glassf3c6a1d2022-07-13 06:06:59 -060023
24/* Declare a new fdt test */
Simon Glassb15512c2025-01-20 14:25:32 -070025#define FDT_TEST(_name, _flags) UNIT_TEST(_name, _flags, fdt)
Simon Glassf3c6a1d2022-07-13 06:06:59 -060026
27/**
28 * make_test_fdt() - Create an FDT with just a root node
29 *
Simon Glass27c46ab2024-08-22 07:57:56 -060030 * The size is set to the minimum needed. This also sets the working FDT and
31 * checks that the expected output is received from doing so.
Simon Glassf3c6a1d2022-07-13 06:06:59 -060032 *
33 * @uts: Test state
34 * @fdt: Place to write FDT
35 * @size: Maximum size of space for fdt
Simon Glass27c46ab2024-08-22 07:57:56 -060036 * @addrp: Returns address of the devicetree
Simon Glassf3c6a1d2022-07-13 06:06:59 -060037 */
Simon Glass27c46ab2024-08-22 07:57:56 -060038static int make_test_fdt(struct unit_test_state *uts, void *fdt, int size,
39 ulong *addrp)
Simon Glassf3c6a1d2022-07-13 06:06:59 -060040{
Simon Glass27c46ab2024-08-22 07:57:56 -060041 ulong addr;
42
Simon Glassf3c6a1d2022-07-13 06:06:59 -060043 ut_assertok(fdt_create(fdt, size));
44 ut_assertok(fdt_finish_reservemap(fdt));
45 ut_assert(fdt_begin_node(fdt, "") >= 0);
46 ut_assertok(fdt_end_node(fdt));
47 ut_assertok(fdt_finish(fdt));
48
Simon Glass27c46ab2024-08-22 07:57:56 -060049 addr = map_to_sysmem(fdt);
50 set_working_fdt_addr(addr);
51 ut_assert_nextline("Working FDT set to %lx", addr);
52 *addrp = addr;
53
Simon Glassf3c6a1d2022-07-13 06:06:59 -060054 return 0;
55}
56
Marek Vasut15503d02023-03-02 04:08:27 +010057/**
58 * make_fuller_fdt() - Create an FDT with root node and properties
59 *
Simon Glass27c46ab2024-08-22 07:57:56 -060060 * The size is set to the minimum needed. This also sets the working FDT and
61 * checks that the expected output is received from doing so.
Marek Vasut15503d02023-03-02 04:08:27 +010062 *
63 * @uts: Test state
64 * @fdt: Place to write FDT
65 * @size: Maximum size of space for fdt
Simon Glass27c46ab2024-08-22 07:57:56 -060066 * @addrp: Returns address of the devicetree
Marek Vasut15503d02023-03-02 04:08:27 +010067 */
Simon Glass27c46ab2024-08-22 07:57:56 -060068static int make_fuller_fdt(struct unit_test_state *uts, void *fdt, int size,
69 ulong *addrp)
Marek Vasut15503d02023-03-02 04:08:27 +010070{
71 fdt32_t regs[2] = { cpu_to_fdt32(0x1234), cpu_to_fdt32(0x1000) };
Simon Glass27c46ab2024-08-22 07:57:56 -060072 ulong addr;
Marek Vasut15503d02023-03-02 04:08:27 +010073
74 /*
75 * Assemble the following DT for test purposes:
76 *
77 * / {
78 * #address-cells = <0x00000001>;
79 * #size-cells = <0x00000001>;
80 * compatible = "u-boot,fdt-test";
81 * model = "U-Boot FDT test";
82 *
83 * aliases {
84 * badalias = "/bad/alias";
85 * subnodealias = "/test-node@1234/subnode";
86 * testnodealias = "/test-node@1234";
87 * };
88 *
89 * test-node@1234 {
90 * #address-cells = <0x00000000>;
91 * #size-cells = <0x00000000>;
92 * compatible = "u-boot,fdt-test-device1";
93 * clock-names = "fixed", "i2c", "spi", "uart2", "uart1";
94 * u-boot,empty-property;
95 * clock-frequency = <0x00fde800>;
96 * regs = <0x00001234 0x00001000>;
97 *
98 * subnode {
99 * #address-cells = <0x00000000>;
100 * #size-cells = <0x00000000>;
101 * compatible = "u-boot,fdt-subnode-test-device";
102 * };
103 * };
104 * };
105 */
106
107 ut_assertok(fdt_create(fdt, size));
108 ut_assertok(fdt_finish_reservemap(fdt));
109 ut_assert(fdt_begin_node(fdt, "") >= 0);
110
111 ut_assertok(fdt_property_u32(fdt, "#address-cells", 1));
112 ut_assertok(fdt_property_u32(fdt, "#size-cells", 1));
113 /* <string> */
114 ut_assertok(fdt_property_string(fdt, "compatible", "u-boot,fdt-test"));
115 /* <string> */
116 ut_assertok(fdt_property_string(fdt, "model", "U-Boot FDT test"));
117
118 ut_assert(fdt_begin_node(fdt, "aliases") >= 0);
119 /* <string> */
120 ut_assertok(fdt_property_string(fdt, "badalias", "/bad/alias"));
121 /* <string> */
122 ut_assertok(fdt_property_string(fdt, "subnodealias", "/test-node@1234/subnode"));
123 /* <string> */
124 ut_assertok(fdt_property_string(fdt, "testnodealias", "/test-node@1234"));
125 ut_assertok(fdt_end_node(fdt));
126
127 ut_assert(fdt_begin_node(fdt, "test-node@1234") >= 0);
128 ut_assertok(fdt_property_cell(fdt, "#address-cells", 0));
129 ut_assertok(fdt_property_cell(fdt, "#size-cells", 0));
130 /* <string> */
131 ut_assertok(fdt_property_string(fdt, "compatible", "u-boot,fdt-test-device1"));
132 /* <stringlist> */
133 ut_assertok(fdt_property(fdt, "clock-names", "fixed\0i2c\0spi\0uart2\0uart1\0", 26));
134 /* <empty> */
135 ut_assertok(fdt_property(fdt, "u-boot,empty-property", NULL, 0));
136 /*
137 * <u32>
138 * This value is deliberate as it used to break cmd/fdt.c
139 * is_printable_string() implementation.
140 */
141 ut_assertok(fdt_property_u32(fdt, "clock-frequency", 16640000));
142 /* <prop-encoded-array> */
143 ut_assertok(fdt_property(fdt, "regs", &regs, sizeof(regs)));
144 ut_assert(fdt_begin_node(fdt, "subnode") >= 0);
145 ut_assertok(fdt_property_cell(fdt, "#address-cells", 0));
146 ut_assertok(fdt_property_cell(fdt, "#size-cells", 0));
147 ut_assertok(fdt_property_string(fdt, "compatible", "u-boot,fdt-subnode-test-device"));
148 ut_assertok(fdt_end_node(fdt));
149 ut_assertok(fdt_end_node(fdt));
150
151 ut_assertok(fdt_end_node(fdt));
152 ut_assertok(fdt_finish(fdt));
153
Simon Glass27c46ab2024-08-22 07:57:56 -0600154 addr = map_to_sysmem(fdt);
155 set_working_fdt_addr(addr);
156 ut_assert_nextline("Working FDT set to %lx", addr);
157 *addrp = addr;
158
Marek Vasut15503d02023-03-02 04:08:27 +0100159 return 0;
160}
161
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600162/* Test 'fdt addr' getting/setting address */
163static int fdt_test_addr(struct unit_test_state *uts)
164{
165 const void *fdt_blob, *new_fdt;
166 char fdt[256];
167 ulong addr;
168 int ret;
169
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600170 ut_assertok(run_command("fdt addr -c", 0));
171 ut_assert_nextline("Control fdt: %08lx",
172 (ulong)map_to_sysmem(gd->fdt_blob));
Simon Glassc579bd42024-08-22 07:58:03 -0600173 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600174
175 /* The working fdt is not set, so this should fail */
176 set_working_fdt_addr(0);
Simon Glass84328cf2022-10-11 09:47:12 -0600177 ut_assert_nextline("Working FDT set to 0");
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600178 ut_asserteq(CMD_RET_FAILURE, run_command("fdt addr", 0));
Simon Glass5ad263f2023-10-01 19:15:18 -0600179
180 /*
181 * sandbox fails the check for !blob since the 0 pointer is mapped to
182 * memory somewhere other than at 0x0
183 */
184 if (IS_ENABLED(CONFIG_SANDBOX))
185 ut_assert_nextline("libfdt fdt_check_header(): FDT_ERR_BADMAGIC");
Simon Glassc579bd42024-08-22 07:58:03 -0600186 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600187
188 /* Set up a working FDT and try again */
Simon Glass27c46ab2024-08-22 07:57:56 -0600189 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600190 ut_assertok(run_command("fdt addr", 0));
191 ut_assert_nextline("Working fdt: %08lx", (ulong)map_to_sysmem(fdt));
Simon Glassc579bd42024-08-22 07:58:03 -0600192 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600193
194 /* Set the working FDT */
195 set_working_fdt_addr(0);
Simon Glass84328cf2022-10-11 09:47:12 -0600196 ut_assert_nextline("Working FDT set to 0");
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300197 ut_assertok(run_commandf("fdt addr %08lx", addr));
Simon Glass84328cf2022-10-11 09:47:12 -0600198 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600199 ut_asserteq(addr, map_to_sysmem(working_fdt));
Simon Glassc579bd42024-08-22 07:58:03 -0600200 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600201 set_working_fdt_addr(0);
Simon Glass84328cf2022-10-11 09:47:12 -0600202 ut_assert_nextline("Working FDT set to 0");
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600203
Simon Glass84328cf2022-10-11 09:47:12 -0600204 /* Set the control FDT */
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600205 fdt_blob = gd->fdt_blob;
206 gd->fdt_blob = NULL;
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300207 ret = run_commandf("fdt addr -c %08lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600208 new_fdt = gd->fdt_blob;
209 gd->fdt_blob = fdt_blob;
210 ut_assertok(ret);
211 ut_asserteq(addr, map_to_sysmem(new_fdt));
Simon Glassc579bd42024-08-22 07:58:03 -0600212 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600213
214 /* Test setting an invalid FDT */
215 fdt[0] = 123;
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300216 ut_asserteq(1, run_commandf("fdt addr %08lx", addr));
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600217 ut_assert_nextline("libfdt fdt_check_header(): FDT_ERR_BADMAGIC");
Simon Glassc579bd42024-08-22 07:58:03 -0600218 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600219
220 /* Test detecting an invalid FDT */
221 fdt[0] = 123;
222 set_working_fdt_addr(addr);
Simon Glass84328cf2022-10-11 09:47:12 -0600223 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600224 ut_asserteq(1, run_commandf("fdt addr"));
225 ut_assert_nextline("libfdt fdt_check_header(): FDT_ERR_BADMAGIC");
Simon Glassc579bd42024-08-22 07:58:03 -0600226 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600227
228 return 0;
229}
Simon Glass11fcfa32024-08-22 07:57:50 -0600230FDT_TEST(fdt_test_addr, UTF_CONSOLE);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600231
232/* Test 'fdt addr' resizing an fdt */
Marek Vasut6e04a892023-03-02 04:08:25 +0100233static int fdt_test_addr_resize(struct unit_test_state *uts)
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600234{
235 char fdt[256];
236 const int newsize = sizeof(fdt) / 2;
237 ulong addr;
238
Simon Glass27c46ab2024-08-22 07:57:56 -0600239 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600240
241 /* Test setting and resizing the working FDT to a larger size */
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300242 ut_assertok(run_commandf("fdt addr %08lx %x", addr, newsize));
Simon Glass84328cf2022-10-11 09:47:12 -0600243 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassc579bd42024-08-22 07:58:03 -0600244 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600245
246 /* Try shrinking it */
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300247 ut_assertok(run_commandf("fdt addr %08lx %zx", addr, sizeof(fdt) / 4));
Simon Glass84328cf2022-10-11 09:47:12 -0600248 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600249 ut_assert_nextline("New length %d < existing length %d, ignoring",
250 (int)sizeof(fdt) / 4, newsize);
Simon Glassc579bd42024-08-22 07:58:03 -0600251 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600252
253 /* ...quietly */
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300254 ut_assertok(run_commandf("fdt addr -q %08lx %zx", addr, sizeof(fdt) / 4));
Simon Glassc579bd42024-08-22 07:58:03 -0600255 ut_assert_console_end();
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600256
257 /* We cannot easily provoke errors in fdt_open_into(), so ignore that */
258
259 return 0;
260}
Simon Glass11fcfa32024-08-22 07:57:50 -0600261FDT_TEST(fdt_test_addr_resize, UTF_CONSOLE);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600262
Marek Vasutddf86202023-03-02 04:08:30 +0100263static int fdt_test_move(struct unit_test_state *uts)
264{
265 char fdt[256];
266 ulong addr, newaddr = 0x10000;
267 const int size = sizeof(fdt);
268 uint32_t ts;
269 void *buf;
270
271 /* Original source DT */
Simon Glass27c46ab2024-08-22 07:57:56 -0600272 ut_assertok(make_test_fdt(uts, fdt, size, &addr));
Marek Vasutddf86202023-03-02 04:08:30 +0100273 ts = fdt_totalsize(fdt);
Marek Vasutddf86202023-03-02 04:08:30 +0100274
275 /* Moved target DT location */
276 buf = map_sysmem(newaddr, size);
277 memset(buf, 0, size);
278
279 /* Test moving the working FDT to a new location */
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300280 ut_assertok(run_commandf("fdt move %08lx %08lx %x", addr, newaddr, ts));
Marek Vasutddf86202023-03-02 04:08:30 +0100281 ut_assert_nextline("Working FDT set to %lx", newaddr);
Simon Glassc579bd42024-08-22 07:58:03 -0600282 ut_assert_console_end();
Marek Vasutddf86202023-03-02 04:08:30 +0100283
284 /* Compare the source and destination DTs */
Evgeny Bachinine604bc02023-03-20 11:23:13 +0300285 ut_assertok(run_commandf("cmp.b %08lx %08lx %x", addr, newaddr, ts));
Marek Vasutddf86202023-03-02 04:08:30 +0100286 ut_assert_nextline("Total of %d byte(s) were the same", ts);
Simon Glassc579bd42024-08-22 07:58:03 -0600287 ut_assert_console_end();
Marek Vasutddf86202023-03-02 04:08:30 +0100288
289 return 0;
290}
Simon Glass11fcfa32024-08-22 07:57:50 -0600291FDT_TEST(fdt_test_move, UTF_CONSOLE);
Marek Vasutddf86202023-03-02 04:08:30 +0100292
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100293static int fdt_test_resize(struct unit_test_state *uts)
294{
295 char fdt[256];
296 const unsigned int newsize = 0x2000;
297 uint32_t ts;
298 ulong addr;
299
300 /* Original source DT */
Simon Glass27c46ab2024-08-22 07:57:56 -0600301 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100302 fdt_shrink_to_minimum(fdt, 0); /* Resize with 0 extra bytes */
303 ts = fdt_totalsize(fdt);
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100304
305 /* Test resizing the working FDT and verify the new space was added */
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100306 ut_assertok(run_commandf("fdt resize %x", newsize));
307 ut_asserteq(ts + newsize, fdt_totalsize(fdt));
Simon Glassc579bd42024-08-22 07:58:03 -0600308 ut_assert_console_end();
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100309
310 return 0;
311}
Simon Glass11fcfa32024-08-22 07:57:50 -0600312FDT_TEST(fdt_test_resize, UTF_CONSOLE);
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100313
Marek Vasut76a652a2023-03-02 04:08:32 +0100314static int fdt_test_print_list_common(struct unit_test_state *uts,
315 const char *opc, const char *node)
316{
317 /*
318 * Test printing/listing the working FDT
319 * subnode $node/subnode
320 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100321 ut_assertok(run_commandf("fdt %s %s/subnode", opc, node));
322 ut_assert_nextline("subnode {");
323 ut_assert_nextline("\t#address-cells = <0x00000000>;");
324 ut_assert_nextline("\t#size-cells = <0x00000000>;");
325 ut_assert_nextline("\tcompatible = \"u-boot,fdt-subnode-test-device\";");
326 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -0600327 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100328
329 /*
330 * Test printing/listing the working FDT
331 * path / string property model
332 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100333 ut_assertok(run_commandf("fdt %s / model", opc));
334 ut_assert_nextline("model = \"U-Boot FDT test\"");
Simon Glassc579bd42024-08-22 07:58:03 -0600335 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100336
337 /*
338 * Test printing/listing the working FDT
339 * path $node string property compatible
340 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100341 ut_assertok(run_commandf("fdt %s %s compatible", opc, node));
342 ut_assert_nextline("compatible = \"u-boot,fdt-test-device1\"");
Simon Glassc579bd42024-08-22 07:58:03 -0600343 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100344
345 /*
346 * Test printing/listing the working FDT
347 * path $node stringlist property clock-names
348 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100349 ut_assertok(run_commandf("fdt %s %s clock-names", opc, node));
350 ut_assert_nextline("clock-names = \"fixed\", \"i2c\", \"spi\", \"uart2\", \"uart1\"");
Simon Glassc579bd42024-08-22 07:58:03 -0600351 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100352
353 /*
354 * Test printing/listing the working FDT
355 * path $node u32 property clock-frequency
356 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100357 ut_assertok(run_commandf("fdt %s %s clock-frequency", opc, node));
358 ut_assert_nextline("clock-frequency = <0x00fde800>");
Simon Glassc579bd42024-08-22 07:58:03 -0600359 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100360
361 /*
362 * Test printing/listing the working FDT
363 * path $node empty property u-boot,empty-property
364 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100365 ut_assertok(run_commandf("fdt %s %s u-boot,empty-property", opc, node));
366 /*
367 * This is the only 'fdt print' / 'fdt list' incantation which
368 * prefixes the property with node path. This has been in U-Boot
369 * since the beginning of the command 'fdt', keep it.
370 */
371 ut_assert_nextline("%s u-boot,empty-property", node);
Simon Glassc579bd42024-08-22 07:58:03 -0600372 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100373
374 /*
375 * Test printing/listing the working FDT
376 * path $node prop-encoded array property regs
377 */
Marek Vasut76a652a2023-03-02 04:08:32 +0100378 ut_assertok(run_commandf("fdt %s %s regs", opc, node));
379 ut_assert_nextline("regs = <0x00001234 0x00001000>");
Simon Glassc579bd42024-08-22 07:58:03 -0600380 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100381
382 return 0;
383}
384
385static int fdt_test_print_list(struct unit_test_state *uts, bool print)
386{
387 const char *opc = print ? "print" : "list";
388 char fdt[4096];
389 ulong addr;
390 int ret;
391
392 /* Original source DT */
Simon Glass27c46ab2024-08-22 07:57:56 -0600393 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasut76a652a2023-03-02 04:08:32 +0100394
395 /* Test printing/listing the working FDT -- node / */
Marek Vasut76a652a2023-03-02 04:08:32 +0100396 ut_assertok(run_commandf("fdt %s", opc));
397 ut_assert_nextline("/ {");
398 ut_assert_nextline("\t#address-cells = <0x00000001>;");
399 ut_assert_nextline("\t#size-cells = <0x00000001>;");
400 ut_assert_nextline("\tcompatible = \"u-boot,fdt-test\";");
401 ut_assert_nextline("\tmodel = \"U-Boot FDT test\";");
402 ut_assert_nextline("\taliases {");
403 if (print) {
404 ut_assert_nextline("\t\tbadalias = \"/bad/alias\";");
405 ut_assert_nextline("\t\tsubnodealias = \"/test-node@1234/subnode\";");
406 ut_assert_nextline("\t\ttestnodealias = \"/test-node@1234\";");
407 }
408 ut_assert_nextline("\t};");
409 ut_assert_nextline("\ttest-node@1234 {");
410 if (print) {
411 ut_assert_nextline("\t\t#address-cells = <0x00000000>;");
412 ut_assert_nextline("\t\t#size-cells = <0x00000000>;");
413 ut_assert_nextline("\t\tcompatible = \"u-boot,fdt-test-device1\";");
414 ut_assert_nextline("\t\tclock-names = \"fixed\", \"i2c\", \"spi\", \"uart2\", \"uart1\";");
415 ut_assert_nextline("\t\tu-boot,empty-property;");
416 ut_assert_nextline("\t\tclock-frequency = <0x00fde800>;");
417 ut_assert_nextline("\t\tregs = <0x00001234 0x00001000>;");
418 ut_assert_nextline("\t\tsubnode {");
419 ut_assert_nextline("\t\t\t#address-cells = <0x00000000>;");
420 ut_assert_nextline("\t\t\t#size-cells = <0x00000000>;");
421 ut_assert_nextline("\t\t\tcompatible = \"u-boot,fdt-subnode-test-device\";");
422 ut_assert_nextline("\t\t};");
423 }
424 ut_assert_nextline("\t};");
425 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -0600426 ut_assert_console_end();
Marek Vasut76a652a2023-03-02 04:08:32 +0100427
428 ret = fdt_test_print_list_common(uts, opc, "/test-node@1234");
429 if (!ret)
430 ret = fdt_test_print_list_common(uts, opc, "testnodealias");
431
432 return 0;
433}
434
435static int fdt_test_print(struct unit_test_state *uts)
436{
437 return fdt_test_print_list(uts, true);
438}
Simon Glass11fcfa32024-08-22 07:57:50 -0600439FDT_TEST(fdt_test_print, UTF_CONSOLE);
Marek Vasut76a652a2023-03-02 04:08:32 +0100440
441static int fdt_test_list(struct unit_test_state *uts)
442{
443 return fdt_test_print_list(uts, false);
444}
Simon Glass11fcfa32024-08-22 07:57:50 -0600445FDT_TEST(fdt_test_list, UTF_CONSOLE);
Marek Vasut76a652a2023-03-02 04:08:32 +0100446
Marek Vasutfbeca452023-03-02 04:08:26 +0100447/* Test 'fdt get value' reading an fdt */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100448static int fdt_test_get_value_string(struct unit_test_state *uts,
449 const char *node, const char *prop,
450 const char *idx, const char *strres,
451 const int intres)
452{
Marek Vasut9f90cad2023-03-02 04:08:29 +0100453 ut_assertok(run_commandf("fdt get value var %s %s %s",
454 node, prop, idx ? : ""));
Simon Glassf80a9142024-08-22 07:57:55 -0600455 if (strres)
Marek Vasut9f90cad2023-03-02 04:08:29 +0100456 ut_asserteq_str(strres, env_get("var"));
Simon Glassf80a9142024-08-22 07:57:55 -0600457 else
Marek Vasut9f90cad2023-03-02 04:08:29 +0100458 ut_asserteq(intres, env_get_hex("var", 0x1234));
Simon Glassc579bd42024-08-22 07:58:03 -0600459 ut_assert_console_end();
Marek Vasut9f90cad2023-03-02 04:08:29 +0100460
461 return 0;
462}
463
Marek Vasutb7517b42023-03-02 04:08:28 +0100464static int fdt_test_get_value_common(struct unit_test_state *uts,
465 const char *node)
Marek Vasut78c060d2022-11-14 22:50:00 +0100466{
Marek Vasutb7517b42023-03-02 04:08:28 +0100467 /* Test getting default element of $node node clock-names property */
Simon Glassf80a9142024-08-22 07:57:55 -0600468 ut_assertok(fdt_test_get_value_string(uts, node, "clock-names", NULL,
469 "fixed", 0));
Marek Vasut78c060d2022-11-14 22:50:00 +0100470
Marek Vasutb7517b42023-03-02 04:08:28 +0100471 /* Test getting 0th element of $node node clock-names property */
Simon Glassf80a9142024-08-22 07:57:55 -0600472 ut_assertok(fdt_test_get_value_string(uts, node, "clock-names", "0",
473 "fixed", 0));
Marek Vasut78c060d2022-11-14 22:50:00 +0100474
Marek Vasutb7517b42023-03-02 04:08:28 +0100475 /* Test getting 1st element of $node node clock-names property */
Simon Glassf80a9142024-08-22 07:57:55 -0600476 ut_assertok(fdt_test_get_value_string(uts, node, "clock-names", "1",
477 "i2c", 0));
Marek Vasut78c060d2022-11-14 22:50:00 +0100478
Marek Vasutb7517b42023-03-02 04:08:28 +0100479 /* Test getting 2nd element of $node node clock-names property */
Simon Glassf80a9142024-08-22 07:57:55 -0600480 ut_assertok(fdt_test_get_value_string(uts, node, "clock-names", "2",
481 "spi", 0));
Marek Vasut9f90cad2023-03-02 04:08:29 +0100482
483 /*
484 * Test getting default element of $node node regs property.
485 * The result here is highly unusual, the non-index value read from
486 * integer array is a string of concatenated values from the array,
487 * but only if the array is shorter than 40 characters. Anything
488 * longer is an error. This is a special case for handling hashes.
489 */
Simon Glassf80a9142024-08-22 07:57:55 -0600490 ut_assertok(fdt_test_get_value_string(uts, node, "regs", NULL,
491 "3412000000100000", 0));
Marek Vasut9f90cad2023-03-02 04:08:29 +0100492
493 /* Test getting 0th element of $node node regs property */
Simon Glassf80a9142024-08-22 07:57:55 -0600494 ut_assertok(fdt_test_get_value_string(uts, node, "regs", "0", NULL,
495 0x1234));
Marek Vasut9f90cad2023-03-02 04:08:29 +0100496
497 /* Test getting 1st element of $node node regs property */
Simon Glassf80a9142024-08-22 07:57:55 -0600498 ut_assertok(fdt_test_get_value_string(uts, node, "regs", "1", NULL,
499 0x1000));
Marek Vasut78c060d2022-11-14 22:50:00 +0100500
Marek Vasutb7517b42023-03-02 04:08:28 +0100501 /* Test missing 10th element of $node node clock-names property */
Marek Vasutb7517b42023-03-02 04:08:28 +0100502 ut_asserteq(1, run_commandf("fdt get value ften %s clock-names 10", node));
Simon Glassc579bd42024-08-22 07:58:03 -0600503 ut_assert_console_end();
Marek Vasut78c060d2022-11-14 22:50:00 +0100504
Marek Vasut9f90cad2023-03-02 04:08:29 +0100505 /* Test missing 10th element of $node node regs property */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100506 ut_asserteq(1, run_commandf("fdt get value ften %s regs 10", node));
Simon Glassc579bd42024-08-22 07:58:03 -0600507 ut_assert_console_end();
Marek Vasut9f90cad2023-03-02 04:08:29 +0100508
Marek Vasutb7517b42023-03-02 04:08:28 +0100509 /* Test getting default element of $node node nonexistent property */
Marek Vasutb7517b42023-03-02 04:08:28 +0100510 ut_asserteq(1, run_commandf("fdt get value fnone %s nonexistent", node));
Marek Vasut78c060d2022-11-14 22:50:00 +0100511 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600512 ut_assert_console_end();
Marek Vasut78c060d2022-11-14 22:50:00 +0100513
Marek Vasutb7517b42023-03-02 04:08:28 +0100514 return 0;
515}
516
517static int fdt_test_get_value(struct unit_test_state *uts)
518{
519 char fdt[4096];
520 ulong addr;
Marek Vasutb7517b42023-03-02 04:08:28 +0100521
Simon Glass27c46ab2024-08-22 07:57:56 -0600522 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasutb7517b42023-03-02 04:08:28 +0100523
Simon Glassf80a9142024-08-22 07:57:55 -0600524 ut_assertok(fdt_test_get_value_common(uts, "/test-node@1234"));
525 ut_assertok(fdt_test_get_value_common(uts, "testnodealias"));
Marek Vasutb7517b42023-03-02 04:08:28 +0100526
Marek Vasut78c060d2022-11-14 22:50:00 +0100527 /* Test getting default element of /nonexistent node */
Marek Vasut78c060d2022-11-14 22:50:00 +0100528 ut_asserteq(1, run_command("fdt get value fnode /nonexistent nonexistent", 1));
529 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600530 ut_assert_console_end();
Marek Vasut78c060d2022-11-14 22:50:00 +0100531
Marek Vasutb7517b42023-03-02 04:08:28 +0100532 /* Test getting default element of bad alias */
Marek Vasutb7517b42023-03-02 04:08:28 +0100533 ut_asserteq(1, run_command("fdt get value vbadalias badalias nonexistent", 1));
534 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600535 ut_assert_console_end();
Marek Vasutb7517b42023-03-02 04:08:28 +0100536
537 /* Test getting default element of nonexistent alias */
Marek Vasutb7517b42023-03-02 04:08:28 +0100538 ut_asserteq(1, run_command("fdt get value vnoalias noalias nonexistent", 1));
539 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -0600540 ut_assert_console_end();
Marek Vasutb7517b42023-03-02 04:08:28 +0100541
Marek Vasut78c060d2022-11-14 22:50:00 +0100542 return 0;
543}
Simon Glass11fcfa32024-08-22 07:57:50 -0600544FDT_TEST(fdt_test_get_value, UTF_CONSOLE);
Marek Vasut78c060d2022-11-14 22:50:00 +0100545
Marek Vasut84499932023-03-02 04:08:33 +0100546static int fdt_test_get_name(struct unit_test_state *uts)
547{
548 char fdt[4096];
549 ulong addr;
550
Simon Glass27c46ab2024-08-22 07:57:56 -0600551 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasut84499932023-03-02 04:08:33 +0100552
553 /* Test getting name of node 0 in /, which is /aliases node */
Marek Vasut84499932023-03-02 04:08:33 +0100554 ut_assertok(run_command("fdt get name nzero / 0", 0));
555 ut_asserteq_str("aliases", env_get("nzero"));
Simon Glassc579bd42024-08-22 07:58:03 -0600556 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100557
558 /* Test getting name of node 1 in /, which is /test-node@1234 node */
Marek Vasut84499932023-03-02 04:08:33 +0100559 ut_assertok(run_command("fdt get name none / 1", 0));
560 ut_asserteq_str("test-node@1234", env_get("none"));
Simon Glassc579bd42024-08-22 07:58:03 -0600561 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100562
563 /* Test getting name of node -1 in /, which is /aliases node, same as 0 */
Marek Vasut84499932023-03-02 04:08:33 +0100564 ut_assertok(run_command("fdt get name nmone / -1", 0));
565 ut_asserteq_str("aliases", env_get("nmone"));
Simon Glassc579bd42024-08-22 07:58:03 -0600566 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100567
568 /* Test getting name of node 2 in /, which does not exist */
Marek Vasut84499932023-03-02 04:08:33 +0100569 ut_asserteq(1, run_command("fdt get name ntwo / 2", 1));
570 ut_assert_nextline("libfdt node not found");
Simon Glassc579bd42024-08-22 07:58:03 -0600571 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100572
573 /* Test getting name of node 0 in /test-node@1234, which is /subnode node */
Marek Vasut84499932023-03-02 04:08:33 +0100574 ut_assertok(run_command("fdt get name snzero /test-node@1234 0", 0));
575 ut_asserteq_str("subnode", env_get("snzero"));
576 ut_assertok(run_command("fdt get name asnzero testnodealias 0", 0));
577 ut_asserteq_str("subnode", env_get("asnzero"));
Simon Glassc579bd42024-08-22 07:58:03 -0600578 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100579
580 /* Test getting name of node 1 in /test-node@1234, which does not exist */
Marek Vasut84499932023-03-02 04:08:33 +0100581 ut_asserteq(1, run_command("fdt get name snone /test-node@1234 1", 1));
582 ut_assert_nextline("libfdt node not found");
583 ut_asserteq(1, run_command("fdt get name asnone testnodealias 1", 1));
584 ut_assert_nextline("libfdt node not found");
Simon Glassc579bd42024-08-22 07:58:03 -0600585 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100586
587 /* Test getting name of node -1 in /test-node@1234, which is /subnode node, same as 0 */
Marek Vasut84499932023-03-02 04:08:33 +0100588 ut_assertok(run_command("fdt get name snmone /test-node@1234 -1", 0));
589 ut_asserteq_str("subnode", env_get("snmone"));
590 ut_assertok(run_command("fdt get name asnmone testnodealias -1", 0));
591 ut_asserteq_str("subnode", env_get("asnmone"));
Simon Glassc579bd42024-08-22 07:58:03 -0600592 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100593
594 /* Test getting name of nonexistent node */
Marek Vasut84499932023-03-02 04:08:33 +0100595 ut_asserteq(1, run_command("fdt get name nonode /nonexistent 0", 1));
596 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600597 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100598
599 /* Test getting name of bad alias */
Marek Vasut84499932023-03-02 04:08:33 +0100600 ut_asserteq(1, run_command("fdt get name vbadalias badalias 0", 1));
601 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600602 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100603
604 /* Test getting name of nonexistent alias */
Marek Vasut84499932023-03-02 04:08:33 +0100605 ut_asserteq(1, run_command("fdt get name vnoalias noalias 0", 1));
606 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -0600607 ut_assert_console_end();
Marek Vasut84499932023-03-02 04:08:33 +0100608
609 return 0;
610}
Simon Glass11fcfa32024-08-22 07:57:50 -0600611FDT_TEST(fdt_test_get_name, UTF_CONSOLE);
Marek Vasut84499932023-03-02 04:08:33 +0100612
Marek Vasutcadef862023-03-02 04:08:34 +0100613static int fdt_test_get_addr_common(struct unit_test_state *uts, char *fdt,
614 const char *path, const char *prop)
615{
616 unsigned int offset;
617 int path_offset;
618 void *prop_ptr;
619 int len = 0;
620
621 path_offset = fdt_path_offset(fdt, path);
622 ut_assert(path_offset >= 0);
623 prop_ptr = (void *)fdt_getprop(fdt, path_offset, prop, &len);
624 ut_assertnonnull(prop_ptr);
625 offset = (char *)prop_ptr - fdt;
626
Marek Vasutcadef862023-03-02 04:08:34 +0100627 ut_assertok(run_commandf("fdt get addr pstr %s %s", path, prop));
628 ut_asserteq((ulong)map_sysmem(env_get_hex("fdtaddr", 0x1234), 0),
629 (ulong)(map_sysmem(env_get_hex("pstr", 0x1234), 0) - offset));
Simon Glassc579bd42024-08-22 07:58:03 -0600630 ut_assert_console_end();
Marek Vasutcadef862023-03-02 04:08:34 +0100631
632 return 0;
633}
634
635static int fdt_test_get_addr(struct unit_test_state *uts)
636{
637 char fdt[4096];
638 ulong addr;
639
Simon Glass27c46ab2024-08-22 07:57:56 -0600640 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasutcadef862023-03-02 04:08:34 +0100641
642 /* Test getting address of root node / string property "compatible" */
Simon Glassf80a9142024-08-22 07:57:55 -0600643 ut_assertok(fdt_test_get_addr_common(uts, fdt, "/", "compatible"));
Marek Vasutcadef862023-03-02 04:08:34 +0100644
645 /* Test getting address of node /test-node@1234 stringlist property "clock-names" */
Simon Glassf80a9142024-08-22 07:57:55 -0600646 ut_assertok(fdt_test_get_addr_common(uts, fdt, "/test-node@1234",
647 "clock-names"));
648 ut_assertok(fdt_test_get_addr_common(uts, fdt, "testnodealias",
649 "clock-names"));
Marek Vasutcadef862023-03-02 04:08:34 +0100650
651 /* Test getting address of node /test-node@1234 u32 property "clock-frequency" */
Simon Glassf80a9142024-08-22 07:57:55 -0600652 ut_assertok(fdt_test_get_addr_common(uts, fdt, "/test-node@1234",
653 "clock-frequency"));
654 ut_assertok(fdt_test_get_addr_common(uts, fdt, "testnodealias",
655 "clock-frequency"));
Marek Vasutcadef862023-03-02 04:08:34 +0100656
657 /* Test getting address of node /test-node@1234 empty property "u-boot,empty-property" */
Simon Glassf80a9142024-08-22 07:57:55 -0600658 ut_assertok(fdt_test_get_addr_common(uts, fdt, "/test-node@1234",
659 "u-boot,empty-property"));
660 ut_assertok(fdt_test_get_addr_common(uts, fdt, "testnodealias",
661 "u-boot,empty-property"));
Marek Vasutcadef862023-03-02 04:08:34 +0100662
663 /* Test getting address of node /test-node@1234 array property "regs" */
Simon Glassf80a9142024-08-22 07:57:55 -0600664 ut_assertok(fdt_test_get_addr_common(uts, fdt, "/test-node@1234",
665 "regs"));
666 ut_assertok(fdt_test_get_addr_common(uts, fdt, "testnodealias",
667 "regs"));
Marek Vasutcadef862023-03-02 04:08:34 +0100668
669 /* Test getting address of node /test-node@1234/subnode non-existent property "noprop" */
Marek Vasutcadef862023-03-02 04:08:34 +0100670 ut_asserteq(1, run_command("fdt get addr pnoprop /test-node@1234/subnode noprop", 1));
671 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600672 ut_assert_console_end();
Marek Vasutcadef862023-03-02 04:08:34 +0100673
674 /* Test getting address of non-existent node /test-node@1234/nonode@1 property "noprop" */
Marek Vasutcadef862023-03-02 04:08:34 +0100675 ut_asserteq(1, run_command("fdt get addr pnonode /test-node@1234/nonode@1 noprop", 1));
676 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600677 ut_assert_console_end();
Marek Vasutcadef862023-03-02 04:08:34 +0100678
679 return 0;
680}
Simon Glass11fcfa32024-08-22 07:57:50 -0600681FDT_TEST(fdt_test_get_addr, UTF_CONSOLE);
Marek Vasutcadef862023-03-02 04:08:34 +0100682
Marek Vasutce1b0482023-03-02 04:08:35 +0100683static int fdt_test_get_size_common(struct unit_test_state *uts,
684 const char *path, const char *prop,
685 const unsigned int val)
686{
Marek Vasutce1b0482023-03-02 04:08:35 +0100687 if (prop) {
688 ut_assertok(run_commandf("fdt get size sstr %s %s", path, prop));
689 } else {
690 ut_assertok(run_commandf("fdt get size sstr %s", path));
691 }
692 ut_asserteq(val, env_get_hex("sstr", 0x1234));
Simon Glassc579bd42024-08-22 07:58:03 -0600693 ut_assert_console_end();
Marek Vasutce1b0482023-03-02 04:08:35 +0100694
695 return 0;
696}
697
698static int fdt_test_get_size(struct unit_test_state *uts)
699{
700 char fdt[4096];
701 ulong addr;
702
Simon Glass27c46ab2024-08-22 07:57:56 -0600703 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasutce1b0482023-03-02 04:08:35 +0100704
705 /* Test getting size of root node / string property "compatible" */
Simon Glassf80a9142024-08-22 07:57:55 -0600706 ut_assertok(fdt_test_get_size_common(uts, "/", "compatible", 16));
Marek Vasutce1b0482023-03-02 04:08:35 +0100707
708 /* Test getting size of node /test-node@1234 stringlist property "clock-names" */
Simon Glassf80a9142024-08-22 07:57:55 -0600709 ut_assertok(fdt_test_get_size_common(uts, "/test-node@1234",
710 "clock-names", 26));
711 ut_assertok(fdt_test_get_size_common(uts, "testnodealias",
712 "clock-names", 26));
Marek Vasutce1b0482023-03-02 04:08:35 +0100713
714 /* Test getting size of node /test-node@1234 u32 property "clock-frequency" */
Simon Glassf80a9142024-08-22 07:57:55 -0600715 ut_assertok(fdt_test_get_size_common(uts, "/test-node@1234",
716 "clock-frequency", 4));
717 ut_assertok(fdt_test_get_size_common(uts, "testnodealias",
718 "clock-frequency", 4));
Marek Vasutce1b0482023-03-02 04:08:35 +0100719
720 /* Test getting size of node /test-node@1234 empty property "u-boot,empty-property" */
Simon Glassf80a9142024-08-22 07:57:55 -0600721 ut_assertok(fdt_test_get_size_common(uts, "/test-node@1234",
722 "u-boot,empty-property", 0));
723 ut_assertok(fdt_test_get_size_common(uts, "testnodealias",
724 "u-boot,empty-property", 0));
Marek Vasutce1b0482023-03-02 04:08:35 +0100725
726 /* Test getting size of node /test-node@1234 array property "regs" */
Simon Glassf80a9142024-08-22 07:57:55 -0600727 ut_assertok(fdt_test_get_size_common(uts, "/test-node@1234", "regs",
728 8));
729 ut_assertok(fdt_test_get_size_common(uts, "testnodealias", "regs", 8));
Marek Vasutce1b0482023-03-02 04:08:35 +0100730
731 /* Test getting node count of node / */
Simon Glassf80a9142024-08-22 07:57:55 -0600732 ut_assertok(fdt_test_get_size_common(uts, "/", NULL, 2));
Marek Vasutce1b0482023-03-02 04:08:35 +0100733
734 /* Test getting node count of node /test-node@1234/subnode */
Simon Glassf80a9142024-08-22 07:57:55 -0600735 ut_assertok(fdt_test_get_size_common(uts, "/test-node@1234/subnode",
736 NULL, 0));
737 ut_assertok(fdt_test_get_size_common(uts, "subnodealias", NULL, 0));
Marek Vasutce1b0482023-03-02 04:08:35 +0100738
739 /* Test getting size of node /test-node@1234/subnode non-existent property "noprop" */
Marek Vasutce1b0482023-03-02 04:08:35 +0100740 ut_asserteq(1, run_command("fdt get size pnoprop /test-node@1234/subnode noprop", 1));
741 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
742 ut_asserteq(1, run_command("fdt get size pnoprop subnodealias noprop", 1));
743 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600744 ut_assert_console_end();
Marek Vasutce1b0482023-03-02 04:08:35 +0100745
746 /* Test getting size of non-existent node /test-node@1234/nonode@1 property "noprop" */
Marek Vasutce1b0482023-03-02 04:08:35 +0100747 ut_asserteq(1, run_command("fdt get size pnonode /test-node@1234/nonode@1 noprop", 1));
748 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600749 ut_assert_console_end();
Marek Vasutce1b0482023-03-02 04:08:35 +0100750
751 /* Test getting node count of non-existent node /test-node@1234/nonode@1 */
Marek Vasutce1b0482023-03-02 04:08:35 +0100752 ut_asserteq(1, run_command("fdt get size pnonode /test-node@1234/nonode@1", 1));
753 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600754 ut_assert_console_end();
Marek Vasutce1b0482023-03-02 04:08:35 +0100755
756 /* Test getting node count of bad alias badalias */
Marek Vasutce1b0482023-03-02 04:08:35 +0100757 ut_asserteq(1, run_command("fdt get size pnonode badalias noprop", 1));
758 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600759 ut_assert_console_end();
Marek Vasutce1b0482023-03-02 04:08:35 +0100760
761 /* Test getting node count of non-existent alias noalias */
Marek Vasutce1b0482023-03-02 04:08:35 +0100762 ut_asserteq(1, run_command("fdt get size pnonode noalias", 1));
763 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -0600764 ut_assert_console_end();
Marek Vasutce1b0482023-03-02 04:08:35 +0100765
766 return 0;
767}
Simon Glass11fcfa32024-08-22 07:57:50 -0600768FDT_TEST(fdt_test_get_size, UTF_CONSOLE);
Marek Vasutce1b0482023-03-02 04:08:35 +0100769
Marek Vasutf180de42023-03-02 04:08:36 +0100770static int fdt_test_set_single(struct unit_test_state *uts,
771 const char *path, const char *prop,
772 const char *sval, int ival, bool integer)
773{
774 /*
775 * Set single element string/integer/<empty> property into DT, that is:
776 * => fdt set /path property string
777 * => fdt set /path property integer
778 * => fdt set /path property
779 */
Marek Vasutbc8c1402023-03-10 04:33:14 +0100780 if (sval)
Marek Vasutf180de42023-03-02 04:08:36 +0100781 ut_assertok(run_commandf("fdt set %s %s %s", path, prop, sval));
Marek Vasutbc8c1402023-03-10 04:33:14 +0100782 else if (integer)
Marek Vasutf180de42023-03-02 04:08:36 +0100783 ut_assertok(run_commandf("fdt set %s %s <%d>", path, prop, ival));
Marek Vasutbc8c1402023-03-10 04:33:14 +0100784 else
Marek Vasutf180de42023-03-02 04:08:36 +0100785 ut_assertok(run_commandf("fdt set %s %s", path, prop));
Marek Vasutf180de42023-03-02 04:08:36 +0100786
787 /* Validate the property is present and has correct value. */
788 ut_assertok(run_commandf("fdt get value svar %s %s", path, prop));
Marek Vasutbc8c1402023-03-10 04:33:14 +0100789 if (sval)
Marek Vasutf180de42023-03-02 04:08:36 +0100790 ut_asserteq_str(sval, env_get("svar"));
Marek Vasutbc8c1402023-03-10 04:33:14 +0100791 else if (integer)
Marek Vasutf180de42023-03-02 04:08:36 +0100792 ut_asserteq(ival, env_get_hex("svar", 0x1234));
Marek Vasutbc8c1402023-03-10 04:33:14 +0100793 else
Marek Vasutf180de42023-03-02 04:08:36 +0100794 ut_assertnull(env_get("svar"));
Simon Glassc579bd42024-08-22 07:58:03 -0600795 ut_assert_console_end();
Marek Vasutf180de42023-03-02 04:08:36 +0100796
797 return 0;
798}
799
800static int fdt_test_set_multi(struct unit_test_state *uts,
801 const char *path, const char *prop,
802 const char *sval1, const char *sval2,
803 int ival1, int ival2)
804{
805 /*
806 * Set multi element string/integer array property in DT, that is:
807 * => fdt set /path property <string1 string2>
808 * => fdt set /path property <integer1 integer2>
809 *
810 * The set is done twice in here deliberately, The first set adds
811 * the property with an extra trailing element in its array to make
812 * the array longer, the second set is the expected final content of
813 * the array property. The longer array is used to verify that the
814 * new array is correctly sized and read past the new array length
815 * triggers failure.
816 */
Marek Vasutf180de42023-03-02 04:08:36 +0100817 if (sval1 && sval2) {
818 ut_assertok(run_commandf("fdt set %s %s %s %s end", path, prop, sval1, sval2));
819 ut_assertok(run_commandf("fdt set %s %s %s %s", path, prop, sval1, sval2));
820 } else {
821 ut_assertok(run_commandf("fdt set %s %s <%d %d 10>", path, prop, ival1, ival2));
822 ut_assertok(run_commandf("fdt set %s %s <%d %d>", path, prop, ival1, ival2));
823 }
824
825 /*
826 * Validate the property is present and has correct value.
827 *
828 * The "end/10" above and "svarn" below is used to validate that
829 * previous 'fdt set' to longer array does not polute newly set
830 * shorter array.
831 */
832 ut_assertok(run_commandf("fdt get value svar1 %s %s 0", path, prop));
833 ut_assertok(run_commandf("fdt get value svar2 %s %s 1", path, prop));
834 ut_asserteq(1, run_commandf("fdt get value svarn %s %s 2", path, prop));
835 if (sval1 && sval2) {
836 ut_asserteq_str(sval1, env_get("svar1"));
837 ut_asserteq_str(sval2, env_get("svar2"));
838 ut_assertnull(env_get("svarn"));
839 } else {
840 ut_asserteq(ival1, env_get_hex("svar1", 0x1234));
841 ut_asserteq(ival2, env_get_hex("svar2", 0x1234));
842 ut_assertnull(env_get("svarn"));
843 }
Simon Glassc579bd42024-08-22 07:58:03 -0600844 ut_assert_console_end();
Marek Vasutf180de42023-03-02 04:08:36 +0100845
846 return 0;
847}
848
849static int fdt_test_set_node(struct unit_test_state *uts,
850 const char *path, const char *prop)
851{
Simon Glassf80a9142024-08-22 07:57:55 -0600852 ut_assertok(fdt_test_set_single(uts, path, prop, "new", 0, false));
853 ut_assertok(fdt_test_set_single(uts, path, prop, "rewrite", 0, false));
854 ut_assertok(fdt_test_set_single(uts, path, prop, NULL, 42, true));
855 ut_assertok(fdt_test_set_single(uts, path, prop, NULL, 0, false));
856 ut_assertok(fdt_test_set_multi(uts, path, prop, NULL, NULL, 42, 1701));
857 ut_assertok(fdt_test_set_multi(uts, path, prop, NULL, NULL, 74656, 9));
858 ut_assertok(fdt_test_set_multi(uts, path, prop, "42", "1701", 0, 0));
859 ut_assertok(fdt_test_set_multi(uts, path, prop, "74656", "9", 0, 0));
Marek Vasutf180de42023-03-02 04:08:36 +0100860
861 return 0;
862}
863
864static int fdt_test_set(struct unit_test_state *uts)
865{
866 char fdt[8192];
867 ulong addr;
868
Simon Glass27c46ab2024-08-22 07:57:56 -0600869 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasutf180de42023-03-02 04:08:36 +0100870 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
Marek Vasutf180de42023-03-02 04:08:36 +0100871
872 /* Test setting of root node / existing property "compatible" */
Simon Glassf80a9142024-08-22 07:57:55 -0600873 ut_assertok(fdt_test_set_node(uts, "/", "compatible"));
Marek Vasutf180de42023-03-02 04:08:36 +0100874
875 /* Test setting of root node / new property "newproperty" */
Simon Glassf80a9142024-08-22 07:57:55 -0600876 ut_assertok(fdt_test_set_node(uts, "/", "newproperty"));
Marek Vasutf180de42023-03-02 04:08:36 +0100877
878 /* Test setting of subnode existing property "compatible" */
Simon Glassf80a9142024-08-22 07:57:55 -0600879 ut_assertok(fdt_test_set_node(uts, "/test-node@1234/subnode",
880 "compatible"));
881 ut_assertok(fdt_test_set_node(uts, "subnodealias", "compatible"));
Marek Vasutf180de42023-03-02 04:08:36 +0100882
883 /* Test setting of subnode new property "newproperty" */
Simon Glassf80a9142024-08-22 07:57:55 -0600884 ut_assertok(fdt_test_set_node(uts, "/test-node@1234/subnode",
885 "newproperty"));
886 ut_assertok(fdt_test_set_node(uts, "subnodealias", "newproperty"));
Marek Vasutf180de42023-03-02 04:08:36 +0100887
888 /* Test setting property of non-existent node */
Marek Vasutf180de42023-03-02 04:08:36 +0100889 ut_asserteq(1, run_command("fdt set /no-node noprop", 1));
890 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600891 ut_assert_console_end();
Marek Vasutf180de42023-03-02 04:08:36 +0100892
893 /* Test setting property of non-existent alias */
Marek Vasutf180de42023-03-02 04:08:36 +0100894 ut_asserteq(1, run_command("fdt set noalias noprop", 1));
895 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -0600896 ut_assert_console_end();
Marek Vasutf180de42023-03-02 04:08:36 +0100897
898 /* Test setting property of bad alias */
Marek Vasutf180de42023-03-02 04:08:36 +0100899 ut_asserteq(1, run_command("fdt set badalias noprop", 1));
900 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600901 ut_assert_console_end();
Marek Vasutf180de42023-03-02 04:08:36 +0100902
903 return 0;
904}
Simon Glass11fcfa32024-08-22 07:57:50 -0600905FDT_TEST(fdt_test_set, UTF_CONSOLE);
Marek Vasutf180de42023-03-02 04:08:36 +0100906
Marek Vasute4d26c92023-03-02 04:08:37 +0100907static int fdt_test_mknode(struct unit_test_state *uts)
908{
909 char fdt[8192];
910 ulong addr;
911
Simon Glass27c46ab2024-08-22 07:57:56 -0600912 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasute4d26c92023-03-02 04:08:37 +0100913 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
Marek Vasute4d26c92023-03-02 04:08:37 +0100914
915 /* Test creation of new node in / */
Marek Vasute4d26c92023-03-02 04:08:37 +0100916 ut_assertok(run_commandf("fdt mknode / newnode"));
917 ut_assertok(run_commandf("fdt list /newnode"));
918 ut_assert_nextline("newnode {");
919 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -0600920 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100921
922 /* Test creation of new node in /test-node@1234 */
Marek Vasute4d26c92023-03-02 04:08:37 +0100923 ut_assertok(run_commandf("fdt mknode /test-node@1234 newsubnode"));
924 ut_assertok(run_commandf("fdt list /test-node@1234/newsubnode"));
925 ut_assert_nextline("newsubnode {");
926 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -0600927 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100928
929 /* Test creation of new node in /test-node@1234 by alias */
Marek Vasute4d26c92023-03-02 04:08:37 +0100930 ut_assertok(run_commandf("fdt mknode testnodealias newersubnode"));
931 ut_assertok(run_commandf("fdt list testnodealias/newersubnode"));
932 ut_assert_nextline("newersubnode {");
933 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -0600934 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100935
936 /* Test creation of new node in /test-node@1234 over existing node */
Marek Vasute4d26c92023-03-02 04:08:37 +0100937 ut_asserteq(1, run_commandf("fdt mknode testnodealias newsubnode"));
938 ut_assert_nextline("libfdt fdt_add_subnode(): FDT_ERR_EXISTS");
Simon Glassc579bd42024-08-22 07:58:03 -0600939 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100940
941 /* Test creation of new node in /test-node@1234 by alias over existing node */
Marek Vasute4d26c92023-03-02 04:08:37 +0100942 ut_asserteq(1, run_commandf("fdt mknode testnodealias newersubnode"));
943 ut_assert_nextline("libfdt fdt_add_subnode(): FDT_ERR_EXISTS");
Simon Glassc579bd42024-08-22 07:58:03 -0600944 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100945
946 /* Test creation of new node in non-existent node */
Marek Vasute4d26c92023-03-02 04:08:37 +0100947 ut_asserteq(1, run_commandf("fdt mknode /no-node newnosubnode"));
948 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600949 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100950
951 /* Test creation of new node in non-existent alias */
Marek Vasute4d26c92023-03-02 04:08:37 +0100952 ut_asserteq(1, run_commandf("fdt mknode noalias newfailsubnode"));
953 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -0600954 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100955
956 /* Test creation of new node in bad alias */
Marek Vasute4d26c92023-03-02 04:08:37 +0100957 ut_asserteq(1, run_commandf("fdt mknode badalias newbadsubnode"));
958 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600959 ut_assert_console_end();
Marek Vasute4d26c92023-03-02 04:08:37 +0100960
961 return 0;
962}
Simon Glass11fcfa32024-08-22 07:57:50 -0600963FDT_TEST(fdt_test_mknode, UTF_CONSOLE);
Marek Vasute4d26c92023-03-02 04:08:37 +0100964
Marek Vasutc3e350f2023-03-02 04:08:38 +0100965static int fdt_test_rm(struct unit_test_state *uts)
966{
967 char fdt[4096];
968 ulong addr;
969
Simon Glass27c46ab2024-08-22 07:57:56 -0600970 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasutc3e350f2023-03-02 04:08:38 +0100971
972 /* Test removal of property in root node / */
Marek Vasutc3e350f2023-03-02 04:08:38 +0100973 ut_assertok(run_commandf("fdt print / compatible"));
974 ut_assert_nextline("compatible = \"u-boot,fdt-test\"");
975 ut_assertok(run_commandf("fdt rm / compatible"));
976 ut_asserteq(1, run_commandf("fdt print / compatible"));
977 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600978 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +0100979
980 /* Test removal of property clock-names in subnode /test-node@1234 */
Marek Vasutc3e350f2023-03-02 04:08:38 +0100981 ut_assertok(run_commandf("fdt print /test-node@1234 clock-names"));
982 ut_assert_nextline("clock-names = \"fixed\", \"i2c\", \"spi\", \"uart2\", \"uart1\"");
983 ut_assertok(run_commandf("fdt rm /test-node@1234 clock-names"));
984 ut_asserteq(1, run_commandf("fdt print /test-node@1234 clock-names"));
985 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600986 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +0100987
988 /* Test removal of property u-boot,empty-property in subnode /test-node@1234 by alias */
Marek Vasutc3e350f2023-03-02 04:08:38 +0100989 ut_assertok(run_commandf("fdt print testnodealias u-boot,empty-property"));
990 ut_assert_nextline("testnodealias u-boot,empty-property");
991 ut_assertok(run_commandf("fdt rm testnodealias u-boot,empty-property"));
992 ut_asserteq(1, run_commandf("fdt print testnodealias u-boot,empty-property"));
993 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600994 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +0100995
996 /* Test removal of non-existent property noprop in subnode /test-node@1234 */
Marek Vasutc3e350f2023-03-02 04:08:38 +0100997 ut_asserteq(1, run_commandf("fdt rm /test-node@1234 noprop"));
998 ut_assert_nextline("libfdt fdt_delprop(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -0600999 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001000
1001 /* Test removal of non-existent node /no-node@5678 */
Marek Vasutc3e350f2023-03-02 04:08:38 +01001002 ut_asserteq(1, run_commandf("fdt rm /no-node@5678"));
1003 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -06001004 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001005
1006 /* Test removal of subnode /test-node@1234/subnode by alias */
Marek Vasutc3e350f2023-03-02 04:08:38 +01001007 ut_assertok(run_commandf("fdt rm subnodealias"));
1008 ut_asserteq(1, run_commandf("fdt print /test-node@1234/subnode"));
1009 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -06001010 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001011
1012 /* Test removal of node by non-existent alias */
Marek Vasutc3e350f2023-03-02 04:08:38 +01001013 ut_asserteq(1, run_commandf("fdt rm noalias"));
1014 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -06001015 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001016
1017 /* Test removal of node by bad alias */
Marek Vasutc3e350f2023-03-02 04:08:38 +01001018 ut_asserteq(1, run_commandf("fdt rm noalias"));
1019 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
Simon Glassc579bd42024-08-22 07:58:03 -06001020 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001021
1022 /* Test removal of node /test-node@1234 */
Marek Vasutc3e350f2023-03-02 04:08:38 +01001023 ut_assertok(run_commandf("fdt rm /test-node@1234"));
1024 ut_asserteq(1, run_commandf("fdt print /test-node@1234"));
1025 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -06001026 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001027
1028 /* Test removal of node / */
Marek Vasutc3e350f2023-03-02 04:08:38 +01001029 ut_assertok(run_commandf("fdt rm /"));
1030 ut_asserteq(1, run_commandf("fdt print /"));
Simon Glassc579bd42024-08-22 07:58:03 -06001031 ut_assert_console_end();
Marek Vasutc3e350f2023-03-02 04:08:38 +01001032
1033 return 0;
1034}
Simon Glass11fcfa32024-08-22 07:57:50 -06001035FDT_TEST(fdt_test_rm, UTF_CONSOLE);
Marek Vasutc3e350f2023-03-02 04:08:38 +01001036
Marek Vasut2081b1d2023-03-02 04:08:40 +01001037static int fdt_test_bootcpu(struct unit_test_state *uts)
1038{
1039 char fdt[256];
1040 ulong addr;
1041 int i;
1042
Simon Glass27c46ab2024-08-22 07:57:56 -06001043 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasut2081b1d2023-03-02 04:08:40 +01001044
1045 /* Test getting default bootcpu entry */
Marek Vasut2081b1d2023-03-02 04:08:40 +01001046 ut_assertok(run_commandf("fdt header get bootcpu boot_cpuid_phys"));
1047 ut_asserteq(0, env_get_ulong("bootcpu", 10, 0x1234));
Simon Glassc579bd42024-08-22 07:58:03 -06001048 ut_assert_console_end();
Marek Vasut2081b1d2023-03-02 04:08:40 +01001049
1050 /* Test setting and getting new bootcpu entry, twice, to test overwrite */
1051 for (i = 42; i <= 43; i++) {
Marek Vasut2081b1d2023-03-02 04:08:40 +01001052 ut_assertok(run_commandf("fdt bootcpu %d", i));
Simon Glassc579bd42024-08-22 07:58:03 -06001053 ut_assert_console_end();
Marek Vasut2081b1d2023-03-02 04:08:40 +01001054
1055 /* Test getting new bootcpu entry */
Marek Vasut2081b1d2023-03-02 04:08:40 +01001056 ut_assertok(run_commandf("fdt header get bootcpu boot_cpuid_phys"));
1057 ut_asserteq(i, env_get_ulong("bootcpu", 10, 0x1234));
Simon Glassc579bd42024-08-22 07:58:03 -06001058 ut_assert_console_end();
Marek Vasut2081b1d2023-03-02 04:08:40 +01001059 }
1060
1061 return 0;
1062}
Simon Glass11fcfa32024-08-22 07:57:50 -06001063FDT_TEST(fdt_test_bootcpu, UTF_CONSOLE);
Marek Vasut2081b1d2023-03-02 04:08:40 +01001064
Marek Vasut06c13ed2023-03-02 04:08:39 +01001065static int fdt_test_header_get(struct unit_test_state *uts,
1066 const char *field, const unsigned long val)
1067{
1068 /* Test getting valid header entry */
Marek Vasut06c13ed2023-03-02 04:08:39 +01001069 ut_assertok(run_commandf("fdt header get fvar %s", field));
1070 ut_asserteq(val, env_get_hex("fvar", 0x1234));
Simon Glassc579bd42024-08-22 07:58:03 -06001071 ut_assert_console_end();
Marek Vasut06c13ed2023-03-02 04:08:39 +01001072
1073 /* Test getting malformed header entry */
Marek Vasut06c13ed2023-03-02 04:08:39 +01001074 ut_asserteq(1, run_commandf("fdt header get fvar typo%stypo", field));
Simon Glassc579bd42024-08-22 07:58:03 -06001075 ut_assert_console_end();
Marek Vasut06c13ed2023-03-02 04:08:39 +01001076
1077 return 0;
1078}
1079
1080static int fdt_test_header(struct unit_test_state *uts)
1081{
1082 char fdt[256];
1083 ulong addr;
1084
Simon Glass27c46ab2024-08-22 07:57:56 -06001085 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasut06c13ed2023-03-02 04:08:39 +01001086
1087 /* Test header print */
Marek Vasut06c13ed2023-03-02 04:08:39 +01001088 ut_assertok(run_commandf("fdt header"));
1089 ut_assert_nextline("magic:\t\t\t0x%x", fdt_magic(fdt));
1090 ut_assert_nextline("totalsize:\t\t0x%x (%d)", fdt_totalsize(fdt), fdt_totalsize(fdt));
1091 ut_assert_nextline("off_dt_struct:\t\t0x%x", fdt_off_dt_struct(fdt));
1092 ut_assert_nextline("off_dt_strings:\t\t0x%x", fdt_off_dt_strings(fdt));
1093 ut_assert_nextline("off_mem_rsvmap:\t\t0x%x", fdt_off_mem_rsvmap(fdt));
1094 ut_assert_nextline("version:\t\t%d", fdt_version(fdt));
1095 ut_assert_nextline("last_comp_version:\t%d", fdt_last_comp_version(fdt));
1096 ut_assert_nextline("boot_cpuid_phys:\t0x%x", fdt_boot_cpuid_phys(fdt));
1097 ut_assert_nextline("size_dt_strings:\t0x%x", fdt_size_dt_strings(fdt));
1098 ut_assert_nextline("size_dt_struct:\t\t0x%x", fdt_size_dt_struct(fdt));
1099 ut_assert_nextline("number mem_rsv:\t\t0x%x", fdt_num_mem_rsv(fdt));
1100 ut_assert_nextline_empty();
Simon Glassc579bd42024-08-22 07:58:03 -06001101 ut_assert_console_end();
Marek Vasut06c13ed2023-03-02 04:08:39 +01001102
1103 /* Test header get */
Simon Glassf80a9142024-08-22 07:57:55 -06001104 ut_assertok(fdt_test_header_get(uts, "magic", fdt_magic(fdt)));
1105 ut_assertok(fdt_test_header_get(uts, "totalsize", fdt_totalsize(fdt)));
1106 ut_assertok(fdt_test_header_get(uts, "off_dt_struct",
1107 fdt_off_dt_struct(fdt)));
1108 ut_assertok(fdt_test_header_get(uts, "off_dt_strings",
1109 fdt_off_dt_strings(fdt)));
1110 ut_assertok(fdt_test_header_get(uts, "off_mem_rsvmap",
1111 fdt_off_mem_rsvmap(fdt)));
1112 ut_assertok(fdt_test_header_get(uts, "version", fdt_version(fdt)));
1113 ut_assertok(fdt_test_header_get(uts, "last_comp_version",
1114 fdt_last_comp_version(fdt)));
1115 ut_assertok(fdt_test_header_get(uts, "boot_cpuid_phys",
1116 fdt_boot_cpuid_phys(fdt)));
1117 ut_assertok(fdt_test_header_get(uts, "size_dt_strings",
1118 fdt_size_dt_strings(fdt)));
1119 ut_assertok(fdt_test_header_get(uts, "size_dt_struct",
1120 fdt_size_dt_struct(fdt)));
Marek Vasut06c13ed2023-03-02 04:08:39 +01001121
1122 return 0;
1123}
Simon Glass11fcfa32024-08-22 07:57:50 -06001124FDT_TEST(fdt_test_header, UTF_CONSOLE);
Marek Vasut06c13ed2023-03-02 04:08:39 +01001125
Marek Vasut65b6f462023-03-02 04:08:41 +01001126static int fdt_test_memory_cells(struct unit_test_state *uts,
1127 const unsigned int cells)
1128{
1129 unsigned char *pada, *pads;
1130 unsigned char *seta, *sets;
1131 char fdt[8192];
1132 const int size = sizeof(fdt);
1133 fdt32_t *regs;
1134 ulong addr;
1135 char *spc;
1136 int i;
1137
1138 /* Create DT with node /memory { regs = <0x100 0x200>; } and #*cells */
1139 ut_assertnonnull(regs = calloc(2 * cells, sizeof(*regs)));
1140 ut_assertnonnull(pada = calloc(12, cells));
1141 ut_assertnonnull(pads = calloc(12, cells));
1142 ut_assertnonnull(seta = calloc(12, cells));
1143 ut_assertnonnull(sets = calloc(12, cells));
1144 for (i = cells; i >= 1; i--) {
1145 regs[cells - 1] = cpu_to_fdt32(i * 0x10000);
1146 regs[(cells * 2) - 1] = cpu_to_fdt32(~i);
1147 snprintf(seta + (8 * (cells - i)), 9, "%08x", i * 0x10000);
1148 snprintf(sets + (8 * (cells - i)), 9, "%08x", ~i);
1149 spc = (i != 1) ? " " : "";
1150 snprintf(pada + (11 * (cells - i)), 12, "0x%08x%s", i * 0x10000, spc);
1151 snprintf(pads + (11 * (cells - i)), 12, "0x%08x%s", ~i, spc);
1152 }
1153
1154 ut_assertok(fdt_create(fdt, size));
1155 ut_assertok(fdt_finish_reservemap(fdt));
1156 ut_assert(fdt_begin_node(fdt, "") >= 0);
1157 ut_assertok(fdt_property_u32(fdt, "#address-cells", cells));
1158 ut_assertok(fdt_property_u32(fdt, "#size-cells", cells));
1159 ut_assert(fdt_begin_node(fdt, "memory") >= 0);
1160 ut_assertok(fdt_property_string(fdt, "device_type", "memory"));
1161 ut_assertok(fdt_property(fdt, "reg", &regs, cells * 2));
1162 ut_assertok(fdt_end_node(fdt));
1163 ut_assertok(fdt_end_node(fdt));
1164 ut_assertok(fdt_finish(fdt));
1165 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
1166 addr = map_to_sysmem(fdt);
1167 set_working_fdt_addr(addr);
Simon Glass56228252024-08-22 07:57:58 -06001168 ut_assert_nextline("Working FDT set to %lx", addr);
Marek Vasut65b6f462023-03-02 04:08:41 +01001169
1170 /* Test updating the memory node */
Marek Vasut65b6f462023-03-02 04:08:41 +01001171 ut_assertok(run_commandf("fdt memory 0x%s 0x%s", seta, sets));
1172 ut_assertok(run_commandf("fdt print /memory"));
1173 ut_assert_nextline("memory {");
1174 ut_assert_nextline("\tdevice_type = \"memory\";");
1175 ut_assert_nextline("\treg = <%s %s>;", pada, pads);
1176 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001177 ut_assert_console_end();
Marek Vasut65b6f462023-03-02 04:08:41 +01001178
1179 free(sets);
1180 free(seta);
1181 free(pads);
1182 free(pada);
1183 free(regs);
1184
1185 return 0;
1186}
1187
1188static int fdt_test_memory(struct unit_test_state *uts)
1189{
1190 /*
1191 * Test memory fixup for 32 and 64 bit systems, anything bigger is
1192 * so far unsupported and fails because of simple_stroull() being
1193 * 64bit tops in the 'fdt memory' command implementation.
1194 */
Simon Glassf80a9142024-08-22 07:57:55 -06001195 ut_assertok(fdt_test_memory_cells(uts, 1));
1196 ut_assertok(fdt_test_memory_cells(uts, 2));
Marek Vasut65b6f462023-03-02 04:08:41 +01001197
1198 /*
1199 * The 'fdt memory' command is limited to /memory node, it does
1200 * not support any other valid DT memory node format, which is
1201 * either one or multiple /memory@adresss nodes. Therefore, this
1202 * DT variant is not tested here.
1203 */
1204
1205 return 0;
1206}
Simon Glass11fcfa32024-08-22 07:57:50 -06001207FDT_TEST(fdt_test_memory, UTF_CONSOLE);
Marek Vasut65b6f462023-03-02 04:08:41 +01001208
Marek Vasutcd162df2023-03-02 04:08:42 +01001209static int fdt_test_rsvmem(struct unit_test_state *uts)
1210{
1211 char fdt[8192];
1212 ulong addr;
1213
Simon Glass27c46ab2024-08-22 07:57:56 -06001214 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasutcd162df2023-03-02 04:08:42 +01001215 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
1216 fdt_add_mem_rsv(fdt, 0x42, 0x1701);
1217 fdt_add_mem_rsv(fdt, 0x74656, 0x9);
Marek Vasutcd162df2023-03-02 04:08:42 +01001218
1219 /* Test default reserved memory node presence */
Marek Vasutcd162df2023-03-02 04:08:42 +01001220 ut_assertok(run_commandf("fdt rsvmem print"));
1221 ut_assert_nextline("index\t\t start\t\t size");
1222 ut_assert_nextline("------------------------------------------------");
1223 ut_assert_nextline(" %x\t%016x\t%016x", 0, 0x42, 0x1701);
1224 ut_assert_nextline(" %x\t%016x\t%016x", 1, 0x74656, 0x9);
Simon Glassc579bd42024-08-22 07:58:03 -06001225 ut_assert_console_end();
Marek Vasutcd162df2023-03-02 04:08:42 +01001226
1227 /* Test add new reserved memory node */
Marek Vasutcd162df2023-03-02 04:08:42 +01001228 ut_assertok(run_commandf("fdt rsvmem add 0x1234 0x5678"));
1229 ut_assertok(run_commandf("fdt rsvmem print"));
1230 ut_assert_nextline("index\t\t start\t\t size");
1231 ut_assert_nextline("------------------------------------------------");
1232 ut_assert_nextline(" %x\t%016x\t%016x", 0, 0x42, 0x1701);
1233 ut_assert_nextline(" %x\t%016x\t%016x", 1, 0x74656, 0x9);
1234 ut_assert_nextline(" %x\t%016x\t%016x", 2, 0x1234, 0x5678);
Simon Glassc579bd42024-08-22 07:58:03 -06001235 ut_assert_console_end();
Marek Vasutcd162df2023-03-02 04:08:42 +01001236
1237 /* Test delete reserved memory node */
Marek Vasutcd162df2023-03-02 04:08:42 +01001238 ut_assertok(run_commandf("fdt rsvmem delete 0"));
1239 ut_assertok(run_commandf("fdt rsvmem print"));
1240 ut_assert_nextline("index\t\t start\t\t size");
1241 ut_assert_nextline("------------------------------------------------");
1242 ut_assert_nextline(" %x\t%016x\t%016x", 0, 0x74656, 0x9);
1243 ut_assert_nextline(" %x\t%016x\t%016x", 1, 0x1234, 0x5678);
Simon Glassc579bd42024-08-22 07:58:03 -06001244 ut_assert_console_end();
Marek Vasutcd162df2023-03-02 04:08:42 +01001245
1246 /* Test re-add new reserved memory node */
Marek Vasutcd162df2023-03-02 04:08:42 +01001247 ut_assertok(run_commandf("fdt rsvmem add 0x42 0x1701"));
1248 ut_assertok(run_commandf("fdt rsvmem print"));
1249 ut_assert_nextline("index\t\t start\t\t size");
1250 ut_assert_nextline("------------------------------------------------");
1251 ut_assert_nextline(" %x\t%016x\t%016x", 0, 0x74656, 0x9);
1252 ut_assert_nextline(" %x\t%016x\t%016x", 1, 0x1234, 0x5678);
1253 ut_assert_nextline(" %x\t%016x\t%016x", 2, 0x42, 0x1701);
Simon Glassc579bd42024-08-22 07:58:03 -06001254 ut_assert_console_end();
Marek Vasutcd162df2023-03-02 04:08:42 +01001255
1256 /* Test delete nonexistent reserved memory node */
Marek Vasutcd162df2023-03-02 04:08:42 +01001257 ut_asserteq(1, run_commandf("fdt rsvmem delete 10"));
1258 ut_assert_nextline("libfdt fdt_del_mem_rsv(): FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -06001259 ut_assert_console_end();
Marek Vasutcd162df2023-03-02 04:08:42 +01001260
1261 return 0;
1262}
Simon Glass11fcfa32024-08-22 07:57:50 -06001263FDT_TEST(fdt_test_rsvmem, UTF_CONSOLE);
Marek Vasutcd162df2023-03-02 04:08:42 +01001264
Marek Vasut8d450da2023-03-02 04:08:43 +01001265static int fdt_test_chosen(struct unit_test_state *uts)
1266{
1267 const char *env_bootargs = env_get("bootargs");
1268 char fdt[8192];
1269 ulong addr;
1270
Simon Glass27c46ab2024-08-22 07:57:56 -06001271 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt), &addr));
Marek Vasut8d450da2023-03-02 04:08:43 +01001272 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
Marek Vasut8d450da2023-03-02 04:08:43 +01001273
1274 /* Test default chosen node presence, fail as there is no /chosen node */
Marek Vasut8d450da2023-03-02 04:08:43 +01001275 ut_asserteq(1, run_commandf("fdt print /chosen"));
1276 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
Simon Glassc579bd42024-08-22 07:58:03 -06001277 ut_assert_console_end();
Marek Vasut8d450da2023-03-02 04:08:43 +01001278
1279 /* Test add new chosen node without initrd */
Marek Vasut8d450da2023-03-02 04:08:43 +01001280 ut_assertok(run_commandf("fdt chosen"));
1281 ut_assertok(run_commandf("fdt print /chosen"));
1282 ut_assert_nextline("chosen {");
1283 ut_assert_nextlinen("\tu-boot,version = "); /* Ignore the version string */
1284 if (env_bootargs)
1285 ut_assert_nextline("\tbootargs = \"%s\";", env_bootargs);
Tim Harvey009d1562024-06-18 14:06:09 -07001286 if (IS_ENABLED(CONFIG_DM_RNG) &&
1287 !IS_ENABLED(CONFIG_MEASURED_BOOT) &&
1288 !IS_ENABLED(CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT))
1289 ut_assert_nextlinen("\tkaslr-seed = ");
Marek Vasut8d450da2023-03-02 04:08:43 +01001290 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001291 ut_assert_console_end();
Marek Vasut8d450da2023-03-02 04:08:43 +01001292
1293 /* Test add new chosen node with initrd */
Marek Vasut8d450da2023-03-02 04:08:43 +01001294 ut_assertok(run_commandf("fdt chosen 0x1234 0x5678"));
1295 ut_assertok(run_commandf("fdt print /chosen"));
1296 ut_assert_nextline("chosen {");
1297 ut_assert_nextline("\tlinux,initrd-end = <0x%08x 0x%08x>;",
1298 upper_32_bits(0x1234 + 0x5678 - 1),
1299 lower_32_bits(0x1234 + 0x5678 - 1));
1300 ut_assert_nextline("\tlinux,initrd-start = <0x%08x 0x%08x>;",
1301 upper_32_bits(0x1234), lower_32_bits(0x1234));
1302 ut_assert_nextlinen("\tu-boot,version = "); /* Ignore the version string */
1303 if (env_bootargs)
1304 ut_assert_nextline("\tbootargs = \"%s\";", env_bootargs);
Tim Harvey009d1562024-06-18 14:06:09 -07001305 if (IS_ENABLED(CONFIG_DM_RNG) &&
1306 !IS_ENABLED(CONFIG_MEASURED_BOOT) &&
1307 !IS_ENABLED(CONFIG_ARMV8_SEC_FIRMWARE_SUPPORT))
1308 ut_assert_nextlinen("\tkaslr-seed = ");
Marek Vasut8d450da2023-03-02 04:08:43 +01001309 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001310 ut_assert_console_end();
Marek Vasut8d450da2023-03-02 04:08:43 +01001311
1312 return 0;
1313}
Simon Glass11fcfa32024-08-22 07:57:50 -06001314FDT_TEST(fdt_test_chosen, UTF_CONSOLE);
Marek Vasut8d450da2023-03-02 04:08:43 +01001315
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001316static int fdt_test_apply(struct unit_test_state *uts)
1317{
1318 char fdt[8192], fdto[8192];
1319 ulong addr, addro;
1320
1321 /* Create base DT with __symbols__ node */
1322 ut_assertok(fdt_create(fdt, sizeof(fdt)));
1323 ut_assertok(fdt_finish_reservemap(fdt));
1324 ut_assert(fdt_begin_node(fdt, "") >= 0);
1325 ut_assert(fdt_begin_node(fdt, "__symbols__") >= 0);
1326 ut_assertok(fdt_end_node(fdt));
1327 ut_assertok(fdt_end_node(fdt));
1328 ut_assertok(fdt_finish(fdt));
1329 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
1330 addr = map_to_sysmem(fdt);
1331 set_working_fdt_addr(addr);
Simon Glass56228252024-08-22 07:57:58 -06001332 ut_assert_nextline("Working FDT set to %lx", addr);
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001333
1334 /* Create DTO which adds single property to root node / */
1335 ut_assertok(fdt_create(fdto, sizeof(fdto)));
1336 ut_assertok(fdt_finish_reservemap(fdto));
1337 ut_assert(fdt_begin_node(fdto, "") >= 0);
1338 ut_assert(fdt_begin_node(fdto, "fragment") >= 0);
1339 ut_assertok(fdt_property_string(fdto, "target-path", "/"));
1340 ut_assert(fdt_begin_node(fdto, "__overlay__") >= 0);
1341 ut_assertok(fdt_property_string(fdto, "newstring", "newvalue"));
1342 ut_assertok(fdt_end_node(fdto));
1343 ut_assertok(fdt_end_node(fdto));
1344 ut_assertok(fdt_finish(fdto));
1345 addro = map_to_sysmem(fdto);
1346
1347 /* Test default DT print */
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001348 ut_assertok(run_commandf("fdt print /"));
1349 ut_assert_nextline("/ {");
1350 ut_assert_nextline("\t__symbols__ {");
1351 ut_assert_nextline("\t};");
1352 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001353 ut_assert_console_end();
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001354
1355 /* Test simple DTO application */
Evgeny Bachinine604bc02023-03-20 11:23:13 +03001356 ut_assertok(run_commandf("fdt apply 0x%08lx", addro));
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001357 ut_assertok(run_commandf("fdt print /"));
1358 ut_assert_nextline("/ {");
1359 ut_assert_nextline("\tnewstring = \"newvalue\";");
1360 ut_assert_nextline("\t__symbols__ {");
1361 ut_assert_nextline("\t};");
1362 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001363 ut_assert_console_end();
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001364
1365 /*
1366 * Create complex DTO which:
1367 * - modifies newstring property in root node /
1368 * - adds new properties to root node /
1369 * - adds new subnode with properties to root node /
1370 * - adds phandle to the subnode and therefore __symbols__ node
1371 */
1372 ut_assertok(fdt_create(fdto, sizeof(fdto)));
1373 ut_assertok(fdt_finish_reservemap(fdto));
1374 ut_assert(fdt_begin_node(fdto, "") >= 0);
1375 ut_assertok(fdt_property_cell(fdto, "#address-cells", 1));
1376 ut_assertok(fdt_property_cell(fdto, "#size-cells", 0));
1377
1378 ut_assert(fdt_begin_node(fdto, "fragment@0") >= 0);
1379 ut_assertok(fdt_property_string(fdto, "target-path", "/"));
1380 ut_assert(fdt_begin_node(fdto, "__overlay__") >= 0);
1381 ut_assertok(fdt_property_string(fdto, "newstring", "newervalue"));
1382 ut_assertok(fdt_property_u32(fdto, "newu32", 0x12345678));
1383 ut_assertok(fdt_property(fdto, "empty-property", NULL, 0));
1384 ut_assert(fdt_begin_node(fdto, "subnode") >= 0);
1385 ut_assertok(fdt_property_string(fdto, "subnewstring", "newervalue"));
1386 ut_assertok(fdt_property_u32(fdto, "subnewu32", 0x12345678));
1387 ut_assertok(fdt_property(fdto, "subempty-property", NULL, 0));
1388 ut_assertok(fdt_property_u32(fdto, "phandle", 0x01));
1389 ut_assertok(fdt_end_node(fdto));
1390 ut_assertok(fdt_end_node(fdto));
1391 ut_assertok(fdt_end_node(fdto));
1392
1393 ut_assert(fdt_begin_node(fdto, "__symbols__") >= 0);
1394 ut_assertok(fdt_property_string(fdto, "subnodephandle", "/fragment@0/__overlay__/subnode"));
1395 ut_assertok(fdt_end_node(fdto));
1396 ut_assertok(fdt_finish(fdto));
1397 addro = map_to_sysmem(fdto);
1398
1399 /* Test complex DTO application */
Evgeny Bachinine604bc02023-03-20 11:23:13 +03001400 ut_assertok(run_commandf("fdt apply 0x%08lx", addro));
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001401 ut_assertok(run_commandf("fdt print /"));
1402 ut_assert_nextline("/ {");
1403 ut_assert_nextline("\tempty-property;");
1404 ut_assert_nextline("\tnewu32 = <0x12345678>;");
1405 ut_assert_nextline("\tnewstring = \"newervalue\";");
1406 ut_assert_nextline("\tsubnode {");
1407 ut_assert_nextline("\t\tphandle = <0x00000001>;");
1408 ut_assert_nextline("\t\tsubempty-property;");
1409 ut_assert_nextline("\t\tsubnewu32 = <0x12345678>;");
1410 ut_assert_nextline("\t\tsubnewstring = \"newervalue\";");
1411 ut_assert_nextline("\t};");
1412 ut_assert_nextline("\t__symbols__ {");
1413 ut_assert_nextline("\t\tsubnodephandle = \"/subnode\";");
1414 ut_assert_nextline("\t};");
1415 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001416 ut_assert_console_end();
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001417
1418 /*
1419 * Create complex DTO which:
1420 * - modifies subnewu32 property in subnode via phandle and uses __fixups__ node
1421 */
1422 ut_assertok(fdt_create(fdto, sizeof(fdto)));
1423 ut_assertok(fdt_finish_reservemap(fdto));
1424 ut_assert(fdt_begin_node(fdto, "") >= 0);
1425 ut_assertok(fdt_property_cell(fdto, "#address-cells", 1));
1426 ut_assertok(fdt_property_cell(fdto, "#size-cells", 0));
1427
1428 ut_assert(fdt_begin_node(fdto, "fragment@0") >= 0);
1429 ut_assertok(fdt_property_u32(fdto, "target", 0xffffffff));
1430 ut_assert(fdt_begin_node(fdto, "__overlay__") >= 0);
1431 ut_assertok(fdt_property_u32(fdto, "subnewu32", 0xabcdef01));
1432 ut_assertok(fdt_end_node(fdto));
1433 ut_assertok(fdt_end_node(fdto));
1434
1435 ut_assert(fdt_begin_node(fdto, "__fixups__") >= 0);
1436 ut_assertok(fdt_property_string(fdto, "subnodephandle", "/fragment@0:target:0"));
1437 ut_assertok(fdt_end_node(fdto));
1438 ut_assertok(fdt_end_node(fdto));
1439 ut_assertok(fdt_finish(fdto));
1440 addro = map_to_sysmem(fdto);
1441
1442 /* Test complex DTO application */
Evgeny Bachinine604bc02023-03-20 11:23:13 +03001443 ut_assertok(run_commandf("fdt apply 0x%08lx", addro));
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001444 ut_assertok(run_commandf("fdt print /"));
1445 ut_assert_nextline("/ {");
1446 ut_assert_nextline("\tempty-property;");
1447 ut_assert_nextline("\tnewu32 = <0x12345678>;");
1448 ut_assert_nextline("\tnewstring = \"newervalue\";");
1449 ut_assert_nextline("\tsubnode {");
1450 ut_assert_nextline("\t\tphandle = <0x00000001>;");
1451 ut_assert_nextline("\t\tsubempty-property;");
1452 ut_assert_nextline("\t\tsubnewu32 = <0xabcdef01>;");
1453 ut_assert_nextline("\t\tsubnewstring = \"newervalue\";");
1454 ut_assert_nextline("\t};");
1455 ut_assert_nextline("\t__symbols__ {");
1456 ut_assert_nextline("\t\tsubnodephandle = \"/subnode\";");
1457 ut_assert_nextline("\t};");
1458 ut_assert_nextline("};");
Simon Glassc579bd42024-08-22 07:58:03 -06001459 ut_assert_console_end();
Marek Vasutdc0ccea2023-03-02 04:08:44 +01001460
1461 return 0;
1462}
Simon Glass11fcfa32024-08-22 07:57:50 -06001463FDT_TEST(fdt_test_apply, UTF_CONSOLE);