blob: 8ae8a52896e721b5e9dce8922ecb9e50c100513c [file] [log] [blame]
Simon Glassf3c6a1d2022-07-13 06:06:59 -06001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Tests for fdt command
4 *
5 * Copyright 2022 Google LLCmap_to_sysmem(fdt));
6 */
7
8#include <common.h>
9#include <console.h>
10#include <fdt_support.h>
11#include <mapmem.h>
12#include <asm/global_data.h>
13#include <linux/libfdt.h>
14#include <test/suites.h>
15#include <test/ut.h>
16
17DECLARE_GLOBAL_DATA_PTR;
Marek Vasutf2def362023-03-02 04:08:45 +010018/*
19 * Missing tests:
20 * fdt boardsetup - Do board-specific set up
21 * fdt checksign [<addr>] - check FIT signature
22 * <addr> - address of key blob
23 * default gd->fdt_blob
24 */
Simon Glassf3c6a1d2022-07-13 06:06:59 -060025
26/* Declare a new fdt test */
27#define FDT_TEST(_name, _flags) UNIT_TEST(_name, _flags, fdt_test)
28
29/**
30 * make_test_fdt() - Create an FDT with just a root node
31 *
32 * The size is set to the minimum needed
33 *
34 * @uts: Test state
35 * @fdt: Place to write FDT
36 * @size: Maximum size of space for fdt
37 */
38static int make_test_fdt(struct unit_test_state *uts, void *fdt, int size)
39{
40 ut_assertok(fdt_create(fdt, size));
41 ut_assertok(fdt_finish_reservemap(fdt));
42 ut_assert(fdt_begin_node(fdt, "") >= 0);
43 ut_assertok(fdt_end_node(fdt));
44 ut_assertok(fdt_finish(fdt));
45
46 return 0;
47}
48
Marek Vasut15503d02023-03-02 04:08:27 +010049/**
50 * make_fuller_fdt() - Create an FDT with root node and properties
51 *
52 * The size is set to the minimum needed
53 *
54 * @uts: Test state
55 * @fdt: Place to write FDT
56 * @size: Maximum size of space for fdt
57 */
58static int make_fuller_fdt(struct unit_test_state *uts, void *fdt, int size)
59{
60 fdt32_t regs[2] = { cpu_to_fdt32(0x1234), cpu_to_fdt32(0x1000) };
61
62 /*
63 * Assemble the following DT for test purposes:
64 *
65 * / {
66 * #address-cells = <0x00000001>;
67 * #size-cells = <0x00000001>;
68 * compatible = "u-boot,fdt-test";
69 * model = "U-Boot FDT test";
70 *
71 * aliases {
72 * badalias = "/bad/alias";
73 * subnodealias = "/test-node@1234/subnode";
74 * testnodealias = "/test-node@1234";
75 * };
76 *
77 * test-node@1234 {
78 * #address-cells = <0x00000000>;
79 * #size-cells = <0x00000000>;
80 * compatible = "u-boot,fdt-test-device1";
81 * clock-names = "fixed", "i2c", "spi", "uart2", "uart1";
82 * u-boot,empty-property;
83 * clock-frequency = <0x00fde800>;
84 * regs = <0x00001234 0x00001000>;
85 *
86 * subnode {
87 * #address-cells = <0x00000000>;
88 * #size-cells = <0x00000000>;
89 * compatible = "u-boot,fdt-subnode-test-device";
90 * };
91 * };
92 * };
93 */
94
95 ut_assertok(fdt_create(fdt, size));
96 ut_assertok(fdt_finish_reservemap(fdt));
97 ut_assert(fdt_begin_node(fdt, "") >= 0);
98
99 ut_assertok(fdt_property_u32(fdt, "#address-cells", 1));
100 ut_assertok(fdt_property_u32(fdt, "#size-cells", 1));
101 /* <string> */
102 ut_assertok(fdt_property_string(fdt, "compatible", "u-boot,fdt-test"));
103 /* <string> */
104 ut_assertok(fdt_property_string(fdt, "model", "U-Boot FDT test"));
105
106 ut_assert(fdt_begin_node(fdt, "aliases") >= 0);
107 /* <string> */
108 ut_assertok(fdt_property_string(fdt, "badalias", "/bad/alias"));
109 /* <string> */
110 ut_assertok(fdt_property_string(fdt, "subnodealias", "/test-node@1234/subnode"));
111 /* <string> */
112 ut_assertok(fdt_property_string(fdt, "testnodealias", "/test-node@1234"));
113 ut_assertok(fdt_end_node(fdt));
114
115 ut_assert(fdt_begin_node(fdt, "test-node@1234") >= 0);
116 ut_assertok(fdt_property_cell(fdt, "#address-cells", 0));
117 ut_assertok(fdt_property_cell(fdt, "#size-cells", 0));
118 /* <string> */
119 ut_assertok(fdt_property_string(fdt, "compatible", "u-boot,fdt-test-device1"));
120 /* <stringlist> */
121 ut_assertok(fdt_property(fdt, "clock-names", "fixed\0i2c\0spi\0uart2\0uart1\0", 26));
122 /* <empty> */
123 ut_assertok(fdt_property(fdt, "u-boot,empty-property", NULL, 0));
124 /*
125 * <u32>
126 * This value is deliberate as it used to break cmd/fdt.c
127 * is_printable_string() implementation.
128 */
129 ut_assertok(fdt_property_u32(fdt, "clock-frequency", 16640000));
130 /* <prop-encoded-array> */
131 ut_assertok(fdt_property(fdt, "regs", &regs, sizeof(regs)));
132 ut_assert(fdt_begin_node(fdt, "subnode") >= 0);
133 ut_assertok(fdt_property_cell(fdt, "#address-cells", 0));
134 ut_assertok(fdt_property_cell(fdt, "#size-cells", 0));
135 ut_assertok(fdt_property_string(fdt, "compatible", "u-boot,fdt-subnode-test-device"));
136 ut_assertok(fdt_end_node(fdt));
137 ut_assertok(fdt_end_node(fdt));
138
139 ut_assertok(fdt_end_node(fdt));
140 ut_assertok(fdt_finish(fdt));
141
142 return 0;
143}
144
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600145/* Test 'fdt addr' getting/setting address */
146static int fdt_test_addr(struct unit_test_state *uts)
147{
148 const void *fdt_blob, *new_fdt;
149 char fdt[256];
150 ulong addr;
151 int ret;
152
153 ut_assertok(console_record_reset_enable());
154 ut_assertok(run_command("fdt addr -c", 0));
155 ut_assert_nextline("Control fdt: %08lx",
156 (ulong)map_to_sysmem(gd->fdt_blob));
157 ut_assertok(ut_check_console_end(uts));
158
159 /* The working fdt is not set, so this should fail */
160 set_working_fdt_addr(0);
Simon Glass84328cf2022-10-11 09:47:12 -0600161 ut_assert_nextline("Working FDT set to 0");
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600162 ut_asserteq(CMD_RET_FAILURE, run_command("fdt addr", 0));
163 ut_assert_nextline("libfdt fdt_check_header(): FDT_ERR_BADMAGIC");
164 ut_assertok(ut_check_console_end(uts));
165
166 /* Set up a working FDT and try again */
167 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt)));
168 addr = map_to_sysmem(fdt);
169 set_working_fdt_addr(addr);
Simon Glass84328cf2022-10-11 09:47:12 -0600170 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600171 ut_assertok(run_command("fdt addr", 0));
172 ut_assert_nextline("Working fdt: %08lx", (ulong)map_to_sysmem(fdt));
173 ut_assertok(ut_check_console_end(uts));
174
175 /* Set the working FDT */
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_assertok(run_commandf("fdt addr %08x", addr));
Simon Glass84328cf2022-10-11 09:47:12 -0600179 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600180 ut_asserteq(addr, map_to_sysmem(working_fdt));
181 ut_assertok(ut_check_console_end(uts));
182 set_working_fdt_addr(0);
Simon Glass84328cf2022-10-11 09:47:12 -0600183 ut_assert_nextline("Working FDT set to 0");
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600184
Simon Glass84328cf2022-10-11 09:47:12 -0600185 /* Set the control FDT */
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600186 fdt_blob = gd->fdt_blob;
187 gd->fdt_blob = NULL;
188 ret = run_commandf("fdt addr -c %08x", addr);
189 new_fdt = gd->fdt_blob;
190 gd->fdt_blob = fdt_blob;
191 ut_assertok(ret);
192 ut_asserteq(addr, map_to_sysmem(new_fdt));
193 ut_assertok(ut_check_console_end(uts));
194
195 /* Test setting an invalid FDT */
196 fdt[0] = 123;
197 ut_asserteq(1, run_commandf("fdt addr %08x", addr));
198 ut_assert_nextline("libfdt fdt_check_header(): FDT_ERR_BADMAGIC");
199 ut_assertok(ut_check_console_end(uts));
200
201 /* Test detecting an invalid FDT */
202 fdt[0] = 123;
203 set_working_fdt_addr(addr);
Simon Glass84328cf2022-10-11 09:47:12 -0600204 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600205 ut_asserteq(1, run_commandf("fdt addr"));
206 ut_assert_nextline("libfdt fdt_check_header(): FDT_ERR_BADMAGIC");
207 ut_assertok(ut_check_console_end(uts));
208
209 return 0;
210}
211FDT_TEST(fdt_test_addr, UT_TESTF_CONSOLE_REC);
212
213/* Test 'fdt addr' resizing an fdt */
Marek Vasut6e04a892023-03-02 04:08:25 +0100214static int fdt_test_addr_resize(struct unit_test_state *uts)
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600215{
216 char fdt[256];
217 const int newsize = sizeof(fdt) / 2;
218 ulong addr;
219
220 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt)));
221 addr = map_to_sysmem(fdt);
222 set_working_fdt_addr(addr);
223
224 /* Test setting and resizing the working FDT to a larger size */
225 ut_assertok(console_record_reset_enable());
226 ut_assertok(run_commandf("fdt addr %08x %x", addr, newsize));
Simon Glass84328cf2022-10-11 09:47:12 -0600227 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600228 ut_assertok(ut_check_console_end(uts));
229
230 /* Try shrinking it */
231 ut_assertok(run_commandf("fdt addr %08x %x", addr, sizeof(fdt) / 4));
Simon Glass84328cf2022-10-11 09:47:12 -0600232 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600233 ut_assert_nextline("New length %d < existing length %d, ignoring",
234 (int)sizeof(fdt) / 4, newsize);
235 ut_assertok(ut_check_console_end(uts));
236
237 /* ...quietly */
238 ut_assertok(run_commandf("fdt addr -q %08x %x", addr, sizeof(fdt) / 4));
Simon Glass84328cf2022-10-11 09:47:12 -0600239 ut_assert_nextline("Working FDT set to %lx", addr);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600240 ut_assertok(ut_check_console_end(uts));
241
242 /* We cannot easily provoke errors in fdt_open_into(), so ignore that */
243
244 return 0;
245}
Marek Vasut6e04a892023-03-02 04:08:25 +0100246FDT_TEST(fdt_test_addr_resize, UT_TESTF_CONSOLE_REC);
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600247
Marek Vasutddf86202023-03-02 04:08:30 +0100248static int fdt_test_move(struct unit_test_state *uts)
249{
250 char fdt[256];
251 ulong addr, newaddr = 0x10000;
252 const int size = sizeof(fdt);
253 uint32_t ts;
254 void *buf;
255
256 /* Original source DT */
257 ut_assertok(make_test_fdt(uts, fdt, size));
258 ts = fdt_totalsize(fdt);
259 addr = map_to_sysmem(fdt);
260 set_working_fdt_addr(addr);
261
262 /* Moved target DT location */
263 buf = map_sysmem(newaddr, size);
264 memset(buf, 0, size);
265
266 /* Test moving the working FDT to a new location */
267 ut_assertok(console_record_reset_enable());
268 ut_assertok(run_commandf("fdt move %08x %08x %x", addr, newaddr, ts));
269 ut_assert_nextline("Working FDT set to %lx", newaddr);
270 ut_assertok(ut_check_console_end(uts));
271
272 /* Compare the source and destination DTs */
273 ut_assertok(console_record_reset_enable());
274 ut_assertok(run_commandf("cmp.b %08x %08x %x", addr, newaddr, ts));
275 ut_assert_nextline("Total of %d byte(s) were the same", ts);
276 ut_assertok(ut_check_console_end(uts));
277
278 return 0;
279}
280FDT_TEST(fdt_test_move, UT_TESTF_CONSOLE_REC);
281
Marek Vasut6ab4fe22023-03-02 04:08:31 +0100282static int fdt_test_resize(struct unit_test_state *uts)
283{
284 char fdt[256];
285 const unsigned int newsize = 0x2000;
286 uint32_t ts;
287 ulong addr;
288
289 /* Original source DT */
290 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt)));
291 fdt_shrink_to_minimum(fdt, 0); /* Resize with 0 extra bytes */
292 ts = fdt_totalsize(fdt);
293 addr = map_to_sysmem(fdt);
294 set_working_fdt_addr(addr);
295
296 /* Test resizing the working FDT and verify the new space was added */
297 ut_assertok(console_record_reset_enable());
298 ut_assertok(run_commandf("fdt resize %x", newsize));
299 ut_asserteq(ts + newsize, fdt_totalsize(fdt));
300 ut_assertok(ut_check_console_end(uts));
301
302 return 0;
303}
304FDT_TEST(fdt_test_resize, UT_TESTF_CONSOLE_REC);
305
Marek Vasutfbeca452023-03-02 04:08:26 +0100306/* Test 'fdt get value' reading an fdt */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100307static int fdt_test_get_value_string(struct unit_test_state *uts,
308 const char *node, const char *prop,
309 const char *idx, const char *strres,
310 const int intres)
311{
312 ut_assertok(console_record_reset_enable());
313 ut_assertok(run_commandf("fdt get value var %s %s %s",
314 node, prop, idx ? : ""));
315 if (strres) {
316 ut_asserteq_str(strres, env_get("var"));
317 } else {
318 ut_asserteq(intres, env_get_hex("var", 0x1234));
319 }
320 ut_assertok(ut_check_console_end(uts));
321
322 return 0;
323}
324
Marek Vasutb7517b42023-03-02 04:08:28 +0100325static int fdt_test_get_value_common(struct unit_test_state *uts,
326 const char *node)
Marek Vasut78c060d2022-11-14 22:50:00 +0100327{
Marek Vasutb7517b42023-03-02 04:08:28 +0100328 /* Test getting default element of $node node clock-names property */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100329 fdt_test_get_value_string(uts, node, "clock-names", NULL, "fixed", 0);
Marek Vasut78c060d2022-11-14 22:50:00 +0100330
Marek Vasutb7517b42023-03-02 04:08:28 +0100331 /* Test getting 0th element of $node node clock-names property */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100332 fdt_test_get_value_string(uts, node, "clock-names", "0", "fixed", 0);
Marek Vasut78c060d2022-11-14 22:50:00 +0100333
Marek Vasutb7517b42023-03-02 04:08:28 +0100334 /* Test getting 1st element of $node node clock-names property */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100335 fdt_test_get_value_string(uts, node, "clock-names", "1", "i2c", 0);
Marek Vasut78c060d2022-11-14 22:50:00 +0100336
Marek Vasutb7517b42023-03-02 04:08:28 +0100337 /* Test getting 2nd element of $node node clock-names property */
Marek Vasut9f90cad2023-03-02 04:08:29 +0100338 fdt_test_get_value_string(uts, node, "clock-names", "2", "spi", 0);
339
340 /*
341 * Test getting default element of $node node regs property.
342 * The result here is highly unusual, the non-index value read from
343 * integer array is a string of concatenated values from the array,
344 * but only if the array is shorter than 40 characters. Anything
345 * longer is an error. This is a special case for handling hashes.
346 */
347 fdt_test_get_value_string(uts, node, "regs", NULL, "3412000000100000", 0);
348
349 /* Test getting 0th element of $node node regs property */
350 fdt_test_get_value_string(uts, node, "regs", "0", NULL, 0x1234);
351
352 /* Test getting 1st element of $node node regs property */
353 fdt_test_get_value_string(uts, node, "regs", "1", NULL, 0x1000);
Marek Vasut78c060d2022-11-14 22:50:00 +0100354
Marek Vasutb7517b42023-03-02 04:08:28 +0100355 /* Test missing 10th element of $node node clock-names property */
Marek Vasut78c060d2022-11-14 22:50:00 +0100356 ut_assertok(console_record_reset_enable());
Marek Vasutb7517b42023-03-02 04:08:28 +0100357 ut_asserteq(1, run_commandf("fdt get value ften %s clock-names 10", node));
Marek Vasut78c060d2022-11-14 22:50:00 +0100358 ut_assertok(ut_check_console_end(uts));
359
Marek Vasut9f90cad2023-03-02 04:08:29 +0100360 /* Test missing 10th element of $node node regs property */
361 ut_assertok(console_record_reset_enable());
362 ut_asserteq(1, run_commandf("fdt get value ften %s regs 10", node));
363 ut_assertok(ut_check_console_end(uts));
364
Marek Vasutb7517b42023-03-02 04:08:28 +0100365 /* Test getting default element of $node node nonexistent property */
Marek Vasut78c060d2022-11-14 22:50:00 +0100366 ut_assertok(console_record_reset_enable());
Marek Vasutb7517b42023-03-02 04:08:28 +0100367 ut_asserteq(1, run_commandf("fdt get value fnone %s nonexistent", node));
Marek Vasut78c060d2022-11-14 22:50:00 +0100368 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
369 ut_assertok(ut_check_console_end(uts));
370
Marek Vasutb7517b42023-03-02 04:08:28 +0100371 return 0;
372}
373
374static int fdt_test_get_value(struct unit_test_state *uts)
375{
376 char fdt[4096];
377 ulong addr;
378 int ret;
379
380 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
381 addr = map_to_sysmem(fdt);
382 set_working_fdt_addr(addr);
383
384 ret = fdt_test_get_value_common(uts, "/test-node@1234");
385 if (!ret)
386 ret = fdt_test_get_value_common(uts, "testnodealias");
387 if (ret)
388 return ret;
389
Marek Vasut78c060d2022-11-14 22:50:00 +0100390 /* Test getting default element of /nonexistent node */
391 ut_assertok(console_record_reset_enable());
392 ut_asserteq(1, run_command("fdt get value fnode /nonexistent nonexistent", 1));
393 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
394 ut_assertok(ut_check_console_end(uts));
395
Marek Vasutb7517b42023-03-02 04:08:28 +0100396 /* Test getting default element of bad alias */
397 ut_assertok(console_record_reset_enable());
398 ut_asserteq(1, run_command("fdt get value vbadalias badalias nonexistent", 1));
399 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
400 ut_assertok(ut_check_console_end(uts));
401
402 /* Test getting default element of nonexistent alias */
403 ut_assertok(console_record_reset_enable());
404 ut_asserteq(1, run_command("fdt get value vnoalias noalias nonexistent", 1));
405 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
406 ut_assertok(ut_check_console_end(uts));
407
Marek Vasut78c060d2022-11-14 22:50:00 +0100408 return 0;
409}
Marek Vasutfbeca452023-03-02 04:08:26 +0100410FDT_TEST(fdt_test_get_value, UT_TESTF_CONSOLE_REC);
Marek Vasut78c060d2022-11-14 22:50:00 +0100411
Marek Vasut84499932023-03-02 04:08:33 +0100412static int fdt_test_get_name(struct unit_test_state *uts)
413{
414 char fdt[4096];
415 ulong addr;
416
417 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
418 addr = map_to_sysmem(fdt);
419 set_working_fdt_addr(addr);
420
421 /* Test getting name of node 0 in /, which is /aliases node */
422 ut_assertok(console_record_reset_enable());
423 ut_assertok(run_command("fdt get name nzero / 0", 0));
424 ut_asserteq_str("aliases", env_get("nzero"));
425 ut_assertok(ut_check_console_end(uts));
426
427 /* Test getting name of node 1 in /, which is /test-node@1234 node */
428 ut_assertok(console_record_reset_enable());
429 ut_assertok(run_command("fdt get name none / 1", 0));
430 ut_asserteq_str("test-node@1234", env_get("none"));
431 ut_assertok(ut_check_console_end(uts));
432
433 /* Test getting name of node -1 in /, which is /aliases node, same as 0 */
434 ut_assertok(console_record_reset_enable());
435 ut_assertok(run_command("fdt get name nmone / -1", 0));
436 ut_asserteq_str("aliases", env_get("nmone"));
437 ut_assertok(ut_check_console_end(uts));
438
439 /* Test getting name of node 2 in /, which does not exist */
440 ut_assertok(console_record_reset_enable());
441 ut_asserteq(1, run_command("fdt get name ntwo / 2", 1));
442 ut_assert_nextline("libfdt node not found");
443 ut_assertok(ut_check_console_end(uts));
444
445 /* Test getting name of node 0 in /test-node@1234, which is /subnode node */
446 ut_assertok(console_record_reset_enable());
447 ut_assertok(run_command("fdt get name snzero /test-node@1234 0", 0));
448 ut_asserteq_str("subnode", env_get("snzero"));
449 ut_assertok(run_command("fdt get name asnzero testnodealias 0", 0));
450 ut_asserteq_str("subnode", env_get("asnzero"));
451 ut_assertok(ut_check_console_end(uts));
452
453 /* Test getting name of node 1 in /test-node@1234, which does not exist */
454 ut_assertok(console_record_reset_enable());
455 ut_asserteq(1, run_command("fdt get name snone /test-node@1234 1", 1));
456 ut_assert_nextline("libfdt node not found");
457 ut_asserteq(1, run_command("fdt get name asnone testnodealias 1", 1));
458 ut_assert_nextline("libfdt node not found");
459 ut_assertok(ut_check_console_end(uts));
460
461 /* Test getting name of node -1 in /test-node@1234, which is /subnode node, same as 0 */
462 ut_assertok(console_record_reset_enable());
463 ut_assertok(run_command("fdt get name snmone /test-node@1234 -1", 0));
464 ut_asserteq_str("subnode", env_get("snmone"));
465 ut_assertok(run_command("fdt get name asnmone testnodealias -1", 0));
466 ut_asserteq_str("subnode", env_get("asnmone"));
467 ut_assertok(ut_check_console_end(uts));
468
469 /* Test getting name of nonexistent node */
470 ut_assertok(console_record_reset_enable());
471 ut_asserteq(1, run_command("fdt get name nonode /nonexistent 0", 1));
472 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
473 ut_assertok(ut_check_console_end(uts));
474
475 /* Test getting name of bad alias */
476 ut_assertok(console_record_reset_enable());
477 ut_asserteq(1, run_command("fdt get name vbadalias badalias 0", 1));
478 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
479 ut_assertok(ut_check_console_end(uts));
480
481 /* Test getting name of nonexistent alias */
482 ut_assertok(console_record_reset_enable());
483 ut_asserteq(1, run_command("fdt get name vnoalias noalias 0", 1));
484 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
485 ut_assertok(ut_check_console_end(uts));
486
487 return 0;
488}
489FDT_TEST(fdt_test_get_name, UT_TESTF_CONSOLE_REC);
490
Marek Vasutcadef862023-03-02 04:08:34 +0100491static int fdt_test_get_addr_common(struct unit_test_state *uts, char *fdt,
492 const char *path, const char *prop)
493{
494 unsigned int offset;
495 int path_offset;
496 void *prop_ptr;
497 int len = 0;
498
499 path_offset = fdt_path_offset(fdt, path);
500 ut_assert(path_offset >= 0);
501 prop_ptr = (void *)fdt_getprop(fdt, path_offset, prop, &len);
502 ut_assertnonnull(prop_ptr);
503 offset = (char *)prop_ptr - fdt;
504
505 ut_assertok(console_record_reset_enable());
506 ut_assertok(run_commandf("fdt get addr pstr %s %s", path, prop));
507 ut_asserteq((ulong)map_sysmem(env_get_hex("fdtaddr", 0x1234), 0),
508 (ulong)(map_sysmem(env_get_hex("pstr", 0x1234), 0) - offset));
509 ut_assertok(ut_check_console_end(uts));
510
511 return 0;
512}
513
514static int fdt_test_get_addr(struct unit_test_state *uts)
515{
516 char fdt[4096];
517 ulong addr;
518
519 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
520 addr = map_to_sysmem(fdt);
521 set_working_fdt_addr(addr);
522
523 /* Test getting address of root node / string property "compatible" */
524 fdt_test_get_addr_common(uts, fdt, "/", "compatible");
525
526 /* Test getting address of node /test-node@1234 stringlist property "clock-names" */
527 fdt_test_get_addr_common(uts, fdt, "/test-node@1234", "clock-names");
528 fdt_test_get_addr_common(uts, fdt, "testnodealias", "clock-names");
529
530 /* Test getting address of node /test-node@1234 u32 property "clock-frequency" */
531 fdt_test_get_addr_common(uts, fdt, "/test-node@1234", "clock-frequency");
532 fdt_test_get_addr_common(uts, fdt, "testnodealias", "clock-frequency");
533
534 /* Test getting address of node /test-node@1234 empty property "u-boot,empty-property" */
535 fdt_test_get_addr_common(uts, fdt, "/test-node@1234", "u-boot,empty-property");
536 fdt_test_get_addr_common(uts, fdt, "testnodealias", "u-boot,empty-property");
537
538 /* Test getting address of node /test-node@1234 array property "regs" */
539 fdt_test_get_addr_common(uts, fdt, "/test-node@1234", "regs");
540 fdt_test_get_addr_common(uts, fdt, "testnodealias", "regs");
541
542 /* Test getting address of node /test-node@1234/subnode non-existent property "noprop" */
543 ut_assertok(console_record_reset_enable());
544 ut_asserteq(1, run_command("fdt get addr pnoprop /test-node@1234/subnode noprop", 1));
545 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
546 ut_assertok(ut_check_console_end(uts));
547
548 /* Test getting address of non-existent node /test-node@1234/nonode@1 property "noprop" */
549 ut_assertok(console_record_reset_enable());
550 ut_asserteq(1, run_command("fdt get addr pnonode /test-node@1234/nonode@1 noprop", 1));
551 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
552 ut_assertok(ut_check_console_end(uts));
553
554 return 0;
555}
556FDT_TEST(fdt_test_get_addr, UT_TESTF_CONSOLE_REC);
557
Marek Vasutce1b0482023-03-02 04:08:35 +0100558static int fdt_test_get_size_common(struct unit_test_state *uts,
559 const char *path, const char *prop,
560 const unsigned int val)
561{
562 ut_assertok(console_record_reset_enable());
563 if (prop) {
564 ut_assertok(run_commandf("fdt get size sstr %s %s", path, prop));
565 } else {
566 ut_assertok(run_commandf("fdt get size sstr %s", path));
567 }
568 ut_asserteq(val, env_get_hex("sstr", 0x1234));
569 ut_assertok(ut_check_console_end(uts));
570
571 return 0;
572}
573
574static int fdt_test_get_size(struct unit_test_state *uts)
575{
576 char fdt[4096];
577 ulong addr;
578
579 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
580 addr = map_to_sysmem(fdt);
581 set_working_fdt_addr(addr);
582
583 /* Test getting size of root node / string property "compatible" */
584 fdt_test_get_size_common(uts, "/", "compatible", 16);
585
586 /* Test getting size of node /test-node@1234 stringlist property "clock-names" */
587 fdt_test_get_size_common(uts, "/test-node@1234", "clock-names", 26);
588 fdt_test_get_size_common(uts, "testnodealias", "clock-names", 26);
589
590 /* Test getting size of node /test-node@1234 u32 property "clock-frequency" */
591 fdt_test_get_size_common(uts, "/test-node@1234", "clock-frequency", 4);
592 fdt_test_get_size_common(uts, "testnodealias", "clock-frequency", 4);
593
594 /* Test getting size of node /test-node@1234 empty property "u-boot,empty-property" */
595 fdt_test_get_size_common(uts, "/test-node@1234", "u-boot,empty-property", 0);
596 fdt_test_get_size_common(uts, "testnodealias", "u-boot,empty-property", 0);
597
598 /* Test getting size of node /test-node@1234 array property "regs" */
599 fdt_test_get_size_common(uts, "/test-node@1234", "regs", 8);
600 fdt_test_get_size_common(uts, "testnodealias", "regs", 8);
601
602 /* Test getting node count of node / */
603 fdt_test_get_size_common(uts, "/", NULL, 2);
604
605 /* Test getting node count of node /test-node@1234/subnode */
606 fdt_test_get_size_common(uts, "/test-node@1234/subnode", NULL, 0);
607 fdt_test_get_size_common(uts, "subnodealias", NULL, 0);
608
609 /* Test getting size of node /test-node@1234/subnode non-existent property "noprop" */
610 ut_assertok(console_record_reset_enable());
611 ut_asserteq(1, run_command("fdt get size pnoprop /test-node@1234/subnode noprop", 1));
612 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
613 ut_asserteq(1, run_command("fdt get size pnoprop subnodealias noprop", 1));
614 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
615 ut_assertok(ut_check_console_end(uts));
616
617 /* Test getting size of non-existent node /test-node@1234/nonode@1 property "noprop" */
618 ut_assertok(console_record_reset_enable());
619 ut_asserteq(1, run_command("fdt get size pnonode /test-node@1234/nonode@1 noprop", 1));
620 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
621 ut_assertok(ut_check_console_end(uts));
622
623 /* Test getting node count of non-existent node /test-node@1234/nonode@1 */
624 ut_assertok(console_record_reset_enable());
625 ut_asserteq(1, run_command("fdt get size pnonode /test-node@1234/nonode@1", 1));
626 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
627 ut_assertok(ut_check_console_end(uts));
628
629 /* Test getting node count of bad alias badalias */
630 ut_assertok(console_record_reset_enable());
631 ut_asserteq(1, run_command("fdt get size pnonode badalias noprop", 1));
632 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
633 ut_assertok(ut_check_console_end(uts));
634
635 /* Test getting node count of non-existent alias noalias */
636 ut_assertok(console_record_reset_enable());
637 ut_asserteq(1, run_command("fdt get size pnonode noalias", 1));
638 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
639 ut_assertok(ut_check_console_end(uts));
640
641 return 0;
642}
643FDT_TEST(fdt_test_get_size, UT_TESTF_CONSOLE_REC);
644
Marek Vasutf180de42023-03-02 04:08:36 +0100645static int fdt_test_set_single(struct unit_test_state *uts,
646 const char *path, const char *prop,
647 const char *sval, int ival, bool integer)
648{
649 /*
650 * Set single element string/integer/<empty> property into DT, that is:
651 * => fdt set /path property string
652 * => fdt set /path property integer
653 * => fdt set /path property
654 */
655 ut_assertok(console_record_reset_enable());
656 if (sval) {
657 ut_assertok(run_commandf("fdt set %s %s %s", path, prop, sval));
658 } else if (integer) {
659 ut_assertok(run_commandf("fdt set %s %s <%d>", path, prop, ival));
660 } else {
661 ut_assertok(run_commandf("fdt set %s %s", path, prop));
662 }
663
664 /* Validate the property is present and has correct value. */
665 ut_assertok(run_commandf("fdt get value svar %s %s", path, prop));
666 if (sval) {
667 ut_asserteq_str(sval, env_get("svar"));
668 } else if (integer) {
669 ut_asserteq(ival, env_get_hex("svar", 0x1234));
670 } else {
671 ut_assertnull(env_get("svar"));
672 }
673 ut_assertok(ut_check_console_end(uts));
674
675 return 0;
676}
677
678static int fdt_test_set_multi(struct unit_test_state *uts,
679 const char *path, const char *prop,
680 const char *sval1, const char *sval2,
681 int ival1, int ival2)
682{
683 /*
684 * Set multi element string/integer array property in DT, that is:
685 * => fdt set /path property <string1 string2>
686 * => fdt set /path property <integer1 integer2>
687 *
688 * The set is done twice in here deliberately, The first set adds
689 * the property with an extra trailing element in its array to make
690 * the array longer, the second set is the expected final content of
691 * the array property. The longer array is used to verify that the
692 * new array is correctly sized and read past the new array length
693 * triggers failure.
694 */
695 ut_assertok(console_record_reset_enable());
696 if (sval1 && sval2) {
697 ut_assertok(run_commandf("fdt set %s %s %s %s end", path, prop, sval1, sval2));
698 ut_assertok(run_commandf("fdt set %s %s %s %s", path, prop, sval1, sval2));
699 } else {
700 ut_assertok(run_commandf("fdt set %s %s <%d %d 10>", path, prop, ival1, ival2));
701 ut_assertok(run_commandf("fdt set %s %s <%d %d>", path, prop, ival1, ival2));
702 }
703
704 /*
705 * Validate the property is present and has correct value.
706 *
707 * The "end/10" above and "svarn" below is used to validate that
708 * previous 'fdt set' to longer array does not polute newly set
709 * shorter array.
710 */
711 ut_assertok(run_commandf("fdt get value svar1 %s %s 0", path, prop));
712 ut_assertok(run_commandf("fdt get value svar2 %s %s 1", path, prop));
713 ut_asserteq(1, run_commandf("fdt get value svarn %s %s 2", path, prop));
714 if (sval1 && sval2) {
715 ut_asserteq_str(sval1, env_get("svar1"));
716 ut_asserteq_str(sval2, env_get("svar2"));
717 ut_assertnull(env_get("svarn"));
718 } else {
719 ut_asserteq(ival1, env_get_hex("svar1", 0x1234));
720 ut_asserteq(ival2, env_get_hex("svar2", 0x1234));
721 ut_assertnull(env_get("svarn"));
722 }
723 ut_assertok(ut_check_console_end(uts));
724
725 return 0;
726}
727
728static int fdt_test_set_node(struct unit_test_state *uts,
729 const char *path, const char *prop)
730{
731 fdt_test_set_single(uts, path, prop, "new", 0, false);
732 fdt_test_set_single(uts, path, prop, "rewrite", 0, false);
733 fdt_test_set_single(uts, path, prop, NULL, 42, true);
734 fdt_test_set_single(uts, path, prop, NULL, 0, false);
735 fdt_test_set_multi(uts, path, prop, NULL, NULL, 42, 1701);
736 fdt_test_set_multi(uts, path, prop, NULL, NULL, 74656, 9);
737 fdt_test_set_multi(uts, path, prop, "42", "1701", 0, 0);
738 fdt_test_set_multi(uts, path, prop, "74656", "9", 0, 0);
739
740 return 0;
741}
742
743static int fdt_test_set(struct unit_test_state *uts)
744{
745 char fdt[8192];
746 ulong addr;
747
748 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
749 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
750 addr = map_to_sysmem(fdt);
751 set_working_fdt_addr(addr);
752
753 /* Test setting of root node / existing property "compatible" */
754 fdt_test_set_node(uts, "/", "compatible");
755
756 /* Test setting of root node / new property "newproperty" */
757 fdt_test_set_node(uts, "/", "newproperty");
758
759 /* Test setting of subnode existing property "compatible" */
760 fdt_test_set_node(uts, "/test-node@1234/subnode", "compatible");
761 fdt_test_set_node(uts, "subnodealias", "compatible");
762
763 /* Test setting of subnode new property "newproperty" */
764 fdt_test_set_node(uts, "/test-node@1234/subnode", "newproperty");
765 fdt_test_set_node(uts, "subnodealias", "newproperty");
766
767 /* Test setting property of non-existent node */
768 ut_assertok(console_record_reset_enable());
769 ut_asserteq(1, run_command("fdt set /no-node noprop", 1));
770 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
771 ut_assertok(ut_check_console_end(uts));
772
773 /* Test setting property of non-existent alias */
774 ut_assertok(console_record_reset_enable());
775 ut_asserteq(1, run_command("fdt set noalias noprop", 1));
776 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
777 ut_assertok(ut_check_console_end(uts));
778
779 /* Test setting property of bad alias */
780 ut_assertok(console_record_reset_enable());
781 ut_asserteq(1, run_command("fdt set badalias noprop", 1));
782 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
783 ut_assertok(ut_check_console_end(uts));
784
785 return 0;
786}
787FDT_TEST(fdt_test_set, UT_TESTF_CONSOLE_REC);
788
Marek Vasute4d26c92023-03-02 04:08:37 +0100789static int fdt_test_mknode(struct unit_test_state *uts)
790{
791 char fdt[8192];
792 ulong addr;
793
794 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
795 fdt_shrink_to_minimum(fdt, 4096); /* Resize with 4096 extra bytes */
796 addr = map_to_sysmem(fdt);
797 set_working_fdt_addr(addr);
798
799 /* Test creation of new node in / */
800 ut_assertok(console_record_reset_enable());
801 ut_assertok(run_commandf("fdt mknode / newnode"));
802 ut_assertok(run_commandf("fdt list /newnode"));
803 ut_assert_nextline("newnode {");
804 ut_assert_nextline("};");
805 ut_assertok(ut_check_console_end(uts));
806
807 /* Test creation of new node in /test-node@1234 */
808 ut_assertok(console_record_reset_enable());
809 ut_assertok(run_commandf("fdt mknode /test-node@1234 newsubnode"));
810 ut_assertok(run_commandf("fdt list /test-node@1234/newsubnode"));
811 ut_assert_nextline("newsubnode {");
812 ut_assert_nextline("};");
813 ut_assertok(ut_check_console_end(uts));
814
815 /* Test creation of new node in /test-node@1234 by alias */
816 ut_assertok(console_record_reset_enable());
817 ut_assertok(run_commandf("fdt mknode testnodealias newersubnode"));
818 ut_assertok(run_commandf("fdt list testnodealias/newersubnode"));
819 ut_assert_nextline("newersubnode {");
820 ut_assert_nextline("};");
821 ut_assertok(ut_check_console_end(uts));
822
823 /* Test creation of new node in /test-node@1234 over existing node */
824 ut_assertok(console_record_reset_enable());
825 ut_asserteq(1, run_commandf("fdt mknode testnodealias newsubnode"));
826 ut_assert_nextline("libfdt fdt_add_subnode(): FDT_ERR_EXISTS");
827 ut_assertok(ut_check_console_end(uts));
828
829 /* Test creation of new node in /test-node@1234 by alias over existing node */
830 ut_assertok(console_record_reset_enable());
831 ut_asserteq(1, run_commandf("fdt mknode testnodealias newersubnode"));
832 ut_assert_nextline("libfdt fdt_add_subnode(): FDT_ERR_EXISTS");
833 ut_assertok(ut_check_console_end(uts));
834
835 /* Test creation of new node in non-existent node */
836 ut_assertok(console_record_reset_enable());
837 ut_asserteq(1, run_commandf("fdt mknode /no-node newnosubnode"));
838 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
839 ut_assertok(ut_check_console_end(uts));
840
841 /* Test creation of new node in non-existent alias */
842 ut_assertok(console_record_reset_enable());
843 ut_asserteq(1, run_commandf("fdt mknode noalias newfailsubnode"));
844 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
845 ut_assertok(ut_check_console_end(uts));
846
847 /* Test creation of new node in bad alias */
848 ut_assertok(console_record_reset_enable());
849 ut_asserteq(1, run_commandf("fdt mknode badalias newbadsubnode"));
850 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
851 ut_assertok(ut_check_console_end(uts));
852
853 return 0;
854}
855FDT_TEST(fdt_test_mknode, UT_TESTF_CONSOLE_REC);
856
Marek Vasutc3e350f2023-03-02 04:08:38 +0100857static int fdt_test_rm(struct unit_test_state *uts)
858{
859 char fdt[4096];
860 ulong addr;
861
862 ut_assertok(make_fuller_fdt(uts, fdt, sizeof(fdt)));
863 addr = map_to_sysmem(fdt);
864 set_working_fdt_addr(addr);
865
866 /* Test removal of property in root node / */
867 ut_assertok(console_record_reset_enable());
868 ut_assertok(run_commandf("fdt print / compatible"));
869 ut_assert_nextline("compatible = \"u-boot,fdt-test\"");
870 ut_assertok(run_commandf("fdt rm / compatible"));
871 ut_asserteq(1, run_commandf("fdt print / compatible"));
872 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
873 ut_assertok(ut_check_console_end(uts));
874
875 /* Test removal of property clock-names in subnode /test-node@1234 */
876 ut_assertok(console_record_reset_enable());
877 ut_assertok(run_commandf("fdt print /test-node@1234 clock-names"));
878 ut_assert_nextline("clock-names = \"fixed\", \"i2c\", \"spi\", \"uart2\", \"uart1\"");
879 ut_assertok(run_commandf("fdt rm /test-node@1234 clock-names"));
880 ut_asserteq(1, run_commandf("fdt print /test-node@1234 clock-names"));
881 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
882 ut_assertok(ut_check_console_end(uts));
883
884 /* Test removal of property u-boot,empty-property in subnode /test-node@1234 by alias */
885 ut_assertok(console_record_reset_enable());
886 ut_assertok(run_commandf("fdt print testnodealias u-boot,empty-property"));
887 ut_assert_nextline("testnodealias u-boot,empty-property");
888 ut_assertok(run_commandf("fdt rm testnodealias u-boot,empty-property"));
889 ut_asserteq(1, run_commandf("fdt print testnodealias u-boot,empty-property"));
890 ut_assert_nextline("libfdt fdt_getprop(): FDT_ERR_NOTFOUND");
891 ut_assertok(ut_check_console_end(uts));
892
893 /* Test removal of non-existent property noprop in subnode /test-node@1234 */
894 ut_assertok(console_record_reset_enable());
895 ut_asserteq(1, run_commandf("fdt rm /test-node@1234 noprop"));
896 ut_assert_nextline("libfdt fdt_delprop(): FDT_ERR_NOTFOUND");
897 ut_assertok(ut_check_console_end(uts));
898
899 /* Test removal of non-existent node /no-node@5678 */
900 ut_assertok(console_record_reset_enable());
901 ut_asserteq(1, run_commandf("fdt rm /no-node@5678"));
902 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
903 ut_assertok(ut_check_console_end(uts));
904
905 /* Test removal of subnode /test-node@1234/subnode by alias */
906 ut_assertok(console_record_reset_enable());
907 ut_assertok(run_commandf("fdt rm subnodealias"));
908 ut_asserteq(1, run_commandf("fdt print /test-node@1234/subnode"));
909 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
910 ut_assertok(ut_check_console_end(uts));
911
912 /* Test removal of node by non-existent alias */
913 ut_assertok(console_record_reset_enable());
914 ut_asserteq(1, run_commandf("fdt rm noalias"));
915 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
916 ut_assertok(ut_check_console_end(uts));
917
918 /* Test removal of node by bad alias */
919 ut_assertok(console_record_reset_enable());
920 ut_asserteq(1, run_commandf("fdt rm noalias"));
921 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_BADPATH");
922 ut_assertok(ut_check_console_end(uts));
923
924 /* Test removal of node /test-node@1234 */
925 ut_assertok(console_record_reset_enable());
926 ut_assertok(run_commandf("fdt rm /test-node@1234"));
927 ut_asserteq(1, run_commandf("fdt print /test-node@1234"));
928 ut_assert_nextline("libfdt fdt_path_offset() returned FDT_ERR_NOTFOUND");
929 ut_assertok(ut_check_console_end(uts));
930
931 /* Test removal of node / */
932 ut_assertok(console_record_reset_enable());
933 ut_assertok(run_commandf("fdt rm /"));
934 ut_asserteq(1, run_commandf("fdt print /"));
935 ut_assertok(ut_check_console_end(uts));
936
937 return 0;
938}
939FDT_TEST(fdt_test_rm, UT_TESTF_CONSOLE_REC);
940
Marek Vasut2081b1d2023-03-02 04:08:40 +0100941static int fdt_test_bootcpu(struct unit_test_state *uts)
942{
943 char fdt[256];
944 ulong addr;
945 int i;
946
947 ut_assertok(make_test_fdt(uts, fdt, sizeof(fdt)));
948 addr = map_to_sysmem(fdt);
949 set_working_fdt_addr(addr);
950
951 /* Test getting default bootcpu entry */
952 ut_assertok(console_record_reset_enable());
953 ut_assertok(run_commandf("fdt header get bootcpu boot_cpuid_phys"));
954 ut_asserteq(0, env_get_ulong("bootcpu", 10, 0x1234));
955 ut_assertok(ut_check_console_end(uts));
956
957 /* Test setting and getting new bootcpu entry, twice, to test overwrite */
958 for (i = 42; i <= 43; i++) {
959 ut_assertok(console_record_reset_enable());
960 ut_assertok(run_commandf("fdt bootcpu %d", i));
961 ut_assertok(ut_check_console_end(uts));
962
963 /* Test getting new bootcpu entry */
964 ut_assertok(console_record_reset_enable());
965 ut_assertok(run_commandf("fdt header get bootcpu boot_cpuid_phys"));
966 ut_asserteq(i, env_get_ulong("bootcpu", 10, 0x1234));
967 ut_assertok(ut_check_console_end(uts));
968 }
969
970 return 0;
971}
972FDT_TEST(fdt_test_bootcpu, UT_TESTF_CONSOLE_REC);
973
Simon Glassf3c6a1d2022-07-13 06:06:59 -0600974int do_ut_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
975{
976 struct unit_test *tests = UNIT_TEST_SUITE_START(fdt_test);
977 const int n_ents = UNIT_TEST_SUITE_COUNT(fdt_test);
978
979 return cmd_ut_category("fdt", "fdt_test_", tests, n_ents, argc, argv);
980}