ofnode.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2022 Google LLC
  4. *
  5. * There are two types of tests in this file:
  6. * - normal ones which act on the control FDT (gd->fdt_blob or gd->of_root)
  7. * - 'other' ones which act on the 'other' FDT (other.dts)
  8. *
  9. * The 'other' ones have an _ot suffix.
  10. *
  11. * The latter are used to check behaviour with multiple device trees,
  12. * particularly with flat tree, where a tree ID is included in ofnode as part of
  13. * the node offset. These tests are typically just for making sure that the
  14. * offset makes it to libfdt correctly and that the resulting return value is
  15. * correctly turned into an ofnode. The 'other' tests do not fully check the
  16. * behaviour of each ofnode function, since that is done by the normal ones.
  17. */
  18. #include <common.h>
  19. #include <dm.h>
  20. #include <log.h>
  21. #include <of_live.h>
  22. #include <dm/device-internal.h>
  23. #include <dm/lists.h>
  24. #include <dm/of_extra.h>
  25. #include <dm/root.h>
  26. #include <dm/test.h>
  27. #include <dm/uclass-internal.h>
  28. #include <test/test.h>
  29. #include <test/ut.h>
  30. /**
  31. * get_other_oftree() - Convert a flat tree into an oftree object
  32. *
  33. * @uts: Test state
  34. * @return: oftree object for the 'other' FDT (see sandbox' other.dts)
  35. */
  36. oftree get_other_oftree(struct unit_test_state *uts)
  37. {
  38. oftree tree;
  39. if (of_live_active())
  40. tree = oftree_from_np(uts->of_other);
  41. else
  42. tree = oftree_from_fdt(uts->other_fdt);
  43. /* An invalid tree may cause failure or crashes */
  44. if (!oftree_valid(tree))
  45. ut_reportf("test needs the UT_TESTF_OTHER_FDT flag");
  46. return tree;
  47. }
  48. /**
  49. * get_oftree() - Convert a flat tree into an oftree object
  50. *
  51. * @uts: Test state
  52. * @fdt: Pointer to flat tree
  53. * @treep: Returns the tree, on success
  54. * Return: 0 if OK, 1 if the tree failed to unflatten, -EOVERFLOW if there are
  55. * too many flat trees to allow another one to be registers (see
  56. * oftree_ensure())
  57. */
  58. int get_oftree(struct unit_test_state *uts, void *fdt, oftree *treep)
  59. {
  60. oftree tree;
  61. if (of_live_active()) {
  62. struct device_node *root;
  63. ut_assertok(unflatten_device_tree(fdt, &root));
  64. tree = oftree_from_np(root);
  65. } else {
  66. tree = oftree_from_fdt(fdt);
  67. if (!oftree_valid(tree))
  68. return -EOVERFLOW;
  69. }
  70. *treep = tree;
  71. return 0;
  72. }
  73. /**
  74. * free_oftree() - Free memory used by get_oftree()
  75. *
  76. * @tree: Tree to free
  77. */
  78. void free_oftree(oftree tree)
  79. {
  80. if (of_live_active())
  81. free(tree.np);
  82. }
  83. static int dm_test_ofnode_compatible(struct unit_test_state *uts)
  84. {
  85. ofnode root_node = ofnode_path("/");
  86. ut_assert(ofnode_valid(root_node));
  87. ut_assert(ofnode_device_is_compatible(root_node, "sandbox"));
  88. return 0;
  89. }
  90. DM_TEST(dm_test_ofnode_compatible,
  91. UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  92. /* check ofnode_device_is_compatible() with the 'other' FDT */
  93. static int dm_test_ofnode_compatible_ot(struct unit_test_state *uts)
  94. {
  95. oftree otree = get_other_oftree(uts);
  96. ofnode oroot = oftree_root(otree);
  97. ut_assert(ofnode_valid(oroot));
  98. ut_assert(ofnode_device_is_compatible(oroot, "sandbox-other"));
  99. return 0;
  100. }
  101. DM_TEST(dm_test_ofnode_compatible_ot, UT_TESTF_OTHER_FDT);
  102. static int dm_test_ofnode_get_by_phandle(struct unit_test_state *uts)
  103. {
  104. /* test invalid phandle */
  105. ut_assert(!ofnode_valid(ofnode_get_by_phandle(0)));
  106. ut_assert(!ofnode_valid(ofnode_get_by_phandle(-1)));
  107. /* test first valid phandle */
  108. ut_assert(ofnode_valid(ofnode_get_by_phandle(1)));
  109. /* test unknown phandle */
  110. ut_assert(!ofnode_valid(ofnode_get_by_phandle(0x1000000)));
  111. ut_assert(ofnode_valid(oftree_get_by_phandle(oftree_default(), 1)));
  112. return 0;
  113. }
  114. DM_TEST(dm_test_ofnode_get_by_phandle, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  115. static int dm_test_ofnode_get_by_phandle_ot(struct unit_test_state *uts)
  116. {
  117. oftree otree = get_other_oftree(uts);
  118. ofnode node;
  119. ut_assert(ofnode_valid(oftree_get_by_phandle(oftree_default(), 1)));
  120. node = oftree_get_by_phandle(otree, 1);
  121. ut_assert(ofnode_valid(node));
  122. ut_asserteq_str("target", ofnode_get_name(node));
  123. return 0;
  124. }
  125. DM_TEST(dm_test_ofnode_get_by_phandle_ot, UT_TESTF_OTHER_FDT);
  126. static int check_prop_values(struct unit_test_state *uts, ofnode start,
  127. const char *propname, const char *propval,
  128. int expect_count)
  129. {
  130. int proplen = strlen(propval) + 1;
  131. const char *str;
  132. ofnode node;
  133. int count;
  134. /* Find first matching node, there should be at least one */
  135. node = ofnode_by_prop_value(start, propname, propval, proplen);
  136. ut_assert(ofnode_valid(node));
  137. str = ofnode_read_string(node, propname);
  138. ut_assert(str && !strcmp(str, propval));
  139. /* Find the rest of the matching nodes */
  140. count = 1;
  141. while (true) {
  142. node = ofnode_by_prop_value(node, propname, propval, proplen);
  143. if (!ofnode_valid(node))
  144. break;
  145. str = ofnode_read_string(node, propname);
  146. ut_asserteq_str(propval, str);
  147. count++;
  148. }
  149. ut_asserteq(expect_count, count);
  150. return 0;
  151. }
  152. static int dm_test_ofnode_by_prop_value(struct unit_test_state *uts)
  153. {
  154. ut_assertok(check_prop_values(uts, ofnode_null(), "compatible",
  155. "denx,u-boot-fdt-test", 11));
  156. return 0;
  157. }
  158. DM_TEST(dm_test_ofnode_by_prop_value, UT_TESTF_SCAN_FDT);
  159. static int dm_test_ofnode_by_prop_value_ot(struct unit_test_state *uts)
  160. {
  161. oftree otree = get_other_oftree(uts);
  162. ut_assertok(check_prop_values(uts, oftree_root(otree), "str-prop",
  163. "other", 2));
  164. return 0;
  165. }
  166. DM_TEST(dm_test_ofnode_by_prop_value_ot, UT_TESTF_OTHER_FDT);
  167. static int dm_test_ofnode_fmap(struct unit_test_state *uts)
  168. {
  169. struct fmap_entry entry;
  170. ofnode node;
  171. node = ofnode_path("/cros-ec/flash");
  172. ut_assert(ofnode_valid(node));
  173. ut_assertok(ofnode_read_fmap_entry(node, &entry));
  174. ut_asserteq(0x08000000, entry.offset);
  175. ut_asserteq(0x20000, entry.length);
  176. return 0;
  177. }
  178. DM_TEST(dm_test_ofnode_fmap, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  179. static int dm_test_ofnode_read(struct unit_test_state *uts)
  180. {
  181. const u32 *val;
  182. ofnode node;
  183. int size;
  184. node = ofnode_path("/a-test");
  185. ut_assert(ofnode_valid(node));
  186. val = ofnode_read_prop(node, "int-value", &size);
  187. ut_assertnonnull(val);
  188. ut_asserteq(4, size);
  189. ut_asserteq(1234, fdt32_to_cpu(val[0]));
  190. val = ofnode_read_prop(node, "missing", &size);
  191. ut_assertnull(val);
  192. ut_asserteq(-FDT_ERR_NOTFOUND, size);
  193. /* Check it works without a size parameter */
  194. val = ofnode_read_prop(node, "missing", NULL);
  195. ut_assertnull(val);
  196. return 0;
  197. }
  198. DM_TEST(dm_test_ofnode_read, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  199. static int dm_test_ofnode_read_ot(struct unit_test_state *uts)
  200. {
  201. oftree otree = get_other_oftree(uts);
  202. const char *val;
  203. ofnode node;
  204. int size;
  205. node = oftree_path(otree, "/node/subnode");
  206. ut_assert(ofnode_valid(node));
  207. val = ofnode_read_prop(node, "str-prop", &size);
  208. ut_assertnonnull(val);
  209. ut_asserteq_str("other", val);
  210. ut_asserteq(6, size);
  211. return 0;
  212. }
  213. DM_TEST(dm_test_ofnode_read_ot, UT_TESTF_OTHER_FDT);
  214. static int dm_test_ofnode_phandle(struct unit_test_state *uts)
  215. {
  216. struct ofnode_phandle_args args;
  217. ofnode node;
  218. int ret;
  219. const char prop[] = "test-gpios";
  220. const char cell[] = "#gpio-cells";
  221. const char prop2[] = "phandle-value";
  222. node = ofnode_path("/a-test");
  223. ut_assert(ofnode_valid(node));
  224. /* Test ofnode_count_phandle_with_args with cell name */
  225. ret = ofnode_count_phandle_with_args(node, "missing", cell, 0);
  226. ut_asserteq(-ENOENT, ret);
  227. ret = ofnode_count_phandle_with_args(node, prop, "#invalid", 0);
  228. ut_asserteq(-EINVAL, ret);
  229. ret = ofnode_count_phandle_with_args(node, prop, cell, 0);
  230. ut_asserteq(5, ret);
  231. /* Test ofnode_parse_phandle_with_args with cell name */
  232. ret = ofnode_parse_phandle_with_args(node, "missing", cell, 0, 0,
  233. &args);
  234. ut_asserteq(-ENOENT, ret);
  235. ret = ofnode_parse_phandle_with_args(node, prop, "#invalid", 0, 0,
  236. &args);
  237. ut_asserteq(-EINVAL, ret);
  238. ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 0, &args);
  239. ut_assertok(ret);
  240. ut_asserteq(1, args.args_count);
  241. ut_asserteq(1, args.args[0]);
  242. ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 1, &args);
  243. ut_assertok(ret);
  244. ut_asserteq(1, args.args_count);
  245. ut_asserteq(4, args.args[0]);
  246. ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 2, &args);
  247. ut_assertok(ret);
  248. ut_asserteq(5, args.args_count);
  249. ut_asserteq(5, args.args[0]);
  250. ut_asserteq(1, args.args[4]);
  251. ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 3, &args);
  252. ut_asserteq(-ENOENT, ret);
  253. ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 4, &args);
  254. ut_assertok(ret);
  255. ut_asserteq(1, args.args_count);
  256. ut_asserteq(12, args.args[0]);
  257. ret = ofnode_parse_phandle_with_args(node, prop, cell, 0, 5, &args);
  258. ut_asserteq(-ENOENT, ret);
  259. /* Test ofnode_count_phandle_with_args with cell count */
  260. ret = ofnode_count_phandle_with_args(node, "missing", NULL, 2);
  261. ut_asserteq(-ENOENT, ret);
  262. ret = ofnode_count_phandle_with_args(node, prop2, NULL, 1);
  263. ut_asserteq(3, ret);
  264. /* Test ofnode_parse_phandle_with_args with cell count */
  265. ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 0, &args);
  266. ut_assertok(ret);
  267. ut_asserteq(1, ofnode_valid(args.node));
  268. ut_asserteq(1, args.args_count);
  269. ut_asserteq(10, args.args[0]);
  270. ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 1, &args);
  271. ut_asserteq(-EINVAL, ret);
  272. ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 2, &args);
  273. ut_assertok(ret);
  274. ut_asserteq(1, ofnode_valid(args.node));
  275. ut_asserteq(1, args.args_count);
  276. ut_asserteq(30, args.args[0]);
  277. ret = ofnode_parse_phandle_with_args(node, prop2, NULL, 1, 3, &args);
  278. ut_asserteq(-ENOENT, ret);
  279. return 0;
  280. }
  281. DM_TEST(dm_test_ofnode_phandle, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  282. static int dm_test_ofnode_phandle_ot(struct unit_test_state *uts)
  283. {
  284. oftree otree = get_other_oftree(uts);
  285. struct ofnode_phandle_args args;
  286. ofnode node;
  287. int ret;
  288. node = oftree_path(otree, "/node");
  289. /* Test ofnode_count_phandle_with_args with cell name */
  290. ret = ofnode_count_phandle_with_args(node, "missing", "#gpio-cells", 0);
  291. ut_asserteq(-ENOENT, ret);
  292. ret = ofnode_count_phandle_with_args(node, "target", "#invalid", 0);
  293. ut_asserteq(-EINVAL, ret);
  294. ret = ofnode_count_phandle_with_args(node, "target", "#gpio-cells", 0);
  295. ut_asserteq(1, ret);
  296. ret = ofnode_parse_phandle_with_args(node, "target", "#gpio-cells", 0,
  297. 0, &args);
  298. ut_assertok(ret);
  299. ut_asserteq(2, args.args_count);
  300. ut_asserteq(3, args.args[0]);
  301. ut_asserteq(4, args.args[1]);
  302. return 0;
  303. }
  304. DM_TEST(dm_test_ofnode_phandle_ot, UT_TESTF_OTHER_FDT);
  305. static int dm_test_ofnode_read_chosen(struct unit_test_state *uts)
  306. {
  307. const char *str;
  308. const u32 *val;
  309. ofnode node;
  310. int size;
  311. str = ofnode_read_chosen_string("setting");
  312. ut_assertnonnull(str);
  313. ut_asserteq_str("sunrise ohoka", str);
  314. ut_asserteq_ptr(NULL, ofnode_read_chosen_string("no-setting"));
  315. node = ofnode_get_chosen_node("other-node");
  316. ut_assert(ofnode_valid(node));
  317. ut_asserteq_str("c-test@5", ofnode_get_name(node));
  318. node = ofnode_get_chosen_node("setting");
  319. ut_assert(!ofnode_valid(node));
  320. val = ofnode_read_chosen_prop("int-values", &size);
  321. ut_assertnonnull(val);
  322. ut_asserteq(8, size);
  323. ut_asserteq(0x1937, fdt32_to_cpu(val[0]));
  324. ut_asserteq(72993, fdt32_to_cpu(val[1]));
  325. return 0;
  326. }
  327. DM_TEST(dm_test_ofnode_read_chosen, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  328. static int dm_test_ofnode_read_aliases(struct unit_test_state *uts)
  329. {
  330. const void *val;
  331. ofnode node;
  332. int size;
  333. node = ofnode_get_aliases_node("ethernet3");
  334. ut_assert(ofnode_valid(node));
  335. ut_asserteq_str("sbe5", ofnode_get_name(node));
  336. node = ofnode_get_aliases_node("unknown");
  337. ut_assert(!ofnode_valid(node));
  338. val = ofnode_read_aliases_prop("spi0", &size);
  339. ut_assertnonnull(val);
  340. ut_asserteq(7, size);
  341. ut_asserteq_str("/spi@0", (const char *)val);
  342. return 0;
  343. }
  344. DM_TEST(dm_test_ofnode_read_aliases, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  345. static int dm_test_ofnode_get_child_count(struct unit_test_state *uts)
  346. {
  347. ofnode node, child_node;
  348. u32 val;
  349. node = ofnode_path("/i-test");
  350. ut_assert(ofnode_valid(node));
  351. val = ofnode_get_child_count(node);
  352. ut_asserteq(3, val);
  353. child_node = ofnode_first_subnode(node);
  354. ut_assert(ofnode_valid(child_node));
  355. val = ofnode_get_child_count(child_node);
  356. ut_asserteq(0, val);
  357. return 0;
  358. }
  359. DM_TEST(dm_test_ofnode_get_child_count,
  360. UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  361. static int dm_test_ofnode_get_child_count_ot(struct unit_test_state *uts)
  362. {
  363. oftree otree = get_other_oftree(uts);
  364. ofnode node, child_node;
  365. u32 val;
  366. node = oftree_path(otree, "/node");
  367. ut_assert(ofnode_valid(node));
  368. val = ofnode_get_child_count(node);
  369. ut_asserteq(2, val);
  370. child_node = ofnode_first_subnode(node);
  371. ut_assert(ofnode_valid(child_node));
  372. val = ofnode_get_child_count(child_node);
  373. ut_asserteq(0, val);
  374. return 0;
  375. }
  376. DM_TEST(dm_test_ofnode_get_child_count_ot, UT_TESTF_OTHER_FDT);
  377. static int dm_test_ofnode_is_enabled(struct unit_test_state *uts)
  378. {
  379. ofnode root_node = ofnode_path("/");
  380. ofnode node = ofnode_path("/usb@0");
  381. ut_assert(ofnode_is_enabled(root_node));
  382. ut_assert(!ofnode_is_enabled(node));
  383. return 0;
  384. }
  385. DM_TEST(dm_test_ofnode_is_enabled, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  386. static int dm_test_ofnode_is_enabled_ot(struct unit_test_state *uts)
  387. {
  388. oftree otree = get_other_oftree(uts);
  389. ofnode root_node = oftree_root(otree);
  390. ofnode node = oftree_path(otree, "/target");
  391. ut_assert(ofnode_is_enabled(root_node));
  392. ut_assert(!ofnode_is_enabled(node));
  393. return 0;
  394. }
  395. DM_TEST(dm_test_ofnode_is_enabled_ot, UT_TESTF_OTHER_FDT);
  396. static int dm_test_ofnode_get_reg(struct unit_test_state *uts)
  397. {
  398. ofnode node;
  399. fdt_addr_t addr;
  400. fdt_size_t size;
  401. node = ofnode_path("/translation-test@8000");
  402. ut_assert(ofnode_valid(node));
  403. addr = ofnode_get_addr(node);
  404. size = ofnode_get_size(node);
  405. ut_asserteq(0x8000, addr);
  406. ut_asserteq(0x4000, size);
  407. node = ofnode_path("/translation-test@8000/dev@1,100");
  408. ut_assert(ofnode_valid(node));
  409. addr = ofnode_get_addr(node);
  410. size = ofnode_get_size(node);
  411. ut_asserteq(0x9000, addr);
  412. ut_asserteq(0x1000, size);
  413. node = ofnode_path("/emul-mux-controller");
  414. ut_assert(ofnode_valid(node));
  415. addr = ofnode_get_addr(node);
  416. size = ofnode_get_size(node);
  417. ut_asserteq_64(FDT_ADDR_T_NONE, addr);
  418. ut_asserteq(FDT_SIZE_T_NONE, size);
  419. node = ofnode_path("/translation-test@8000/noxlatebus@3,300/dev@42");
  420. ut_assert(ofnode_valid(node));
  421. addr = ofnode_get_addr_size_index_notrans(node, 0, &size);
  422. ut_asserteq_64(0x42, addr);
  423. return 0;
  424. }
  425. DM_TEST(dm_test_ofnode_get_reg, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  426. static int dm_test_ofnode_get_reg_ot(struct unit_test_state *uts)
  427. {
  428. oftree otree = get_other_oftree(uts);
  429. ofnode node = oftree_path(otree, "/target");
  430. fdt_addr_t addr;
  431. addr = ofnode_get_addr(node);
  432. ut_asserteq(0x8000, addr);
  433. return 0;
  434. }
  435. DM_TEST(dm_test_ofnode_get_reg_ot, UT_TESTF_OTHER_FDT);
  436. static int dm_test_ofnode_get_path(struct unit_test_state *uts)
  437. {
  438. const char *path = "/translation-test@8000/noxlatebus@3,300/dev@42";
  439. char buf[64];
  440. ofnode node;
  441. node = ofnode_path(path);
  442. ut_assert(ofnode_valid(node));
  443. ut_assertok(ofnode_get_path(node, buf, sizeof(buf)));
  444. ut_asserteq_str(path, buf);
  445. ut_asserteq(-ENOSPC, ofnode_get_path(node, buf, 32));
  446. ut_assertok(ofnode_get_path(ofnode_root(), buf, 32));
  447. ut_asserteq_str("/", buf);
  448. return 0;
  449. }
  450. DM_TEST(dm_test_ofnode_get_path, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  451. static int dm_test_ofnode_get_path_ot(struct unit_test_state *uts)
  452. {
  453. oftree otree = get_other_oftree(uts);
  454. const char *path = "/node/subnode";
  455. ofnode node = oftree_path(otree, path);
  456. char buf[64];
  457. ut_assert(ofnode_valid(node));
  458. ut_assertok(ofnode_get_path(node, buf, sizeof(buf)));
  459. ut_asserteq_str(path, buf);
  460. ut_assertok(ofnode_get_path(oftree_root(otree), buf, 32));
  461. ut_asserteq_str("/", buf);
  462. return 0;
  463. }
  464. DM_TEST(dm_test_ofnode_get_path_ot, UT_TESTF_OTHER_FDT);
  465. static int dm_test_ofnode_conf(struct unit_test_state *uts)
  466. {
  467. ut_assert(!ofnode_conf_read_bool("missing"));
  468. ut_assert(ofnode_conf_read_bool("testing-bool"));
  469. ut_asserteq(123, ofnode_conf_read_int("testing-int", 0));
  470. ut_asserteq(6, ofnode_conf_read_int("missing", 6));
  471. ut_assertnull(ofnode_conf_read_str("missing"));
  472. ut_asserteq_str("testing", ofnode_conf_read_str("testing-str"));
  473. return 0;
  474. }
  475. DM_TEST(dm_test_ofnode_conf, 0);
  476. static int dm_test_ofnode_for_each_compatible_node(struct unit_test_state *uts)
  477. {
  478. const char compatible[] = "denx,u-boot-fdt-test";
  479. bool found = false;
  480. ofnode node;
  481. ofnode_for_each_compatible_node(node, compatible) {
  482. ut_assert(ofnode_device_is_compatible(node, compatible));
  483. found = true;
  484. }
  485. /* There should be at least one matching node */
  486. ut_assert(found);
  487. return 0;
  488. }
  489. DM_TEST(dm_test_ofnode_for_each_compatible_node, UT_TESTF_SCAN_FDT);
  490. static int dm_test_ofnode_string(struct unit_test_state *uts)
  491. {
  492. const char **val;
  493. const char *out;
  494. ofnode node;
  495. node = ofnode_path("/a-test");
  496. ut_assert(ofnode_valid(node));
  497. /* single string */
  498. ut_asserteq(1, ofnode_read_string_count(node, "str-value"));
  499. ut_assertok(ofnode_read_string_index(node, "str-value", 0, &out));
  500. ut_asserteq_str("test string", out);
  501. ut_asserteq(0, ofnode_stringlist_search(node, "str-value",
  502. "test string"));
  503. ut_asserteq(1, ofnode_read_string_list(node, "str-value", &val));
  504. ut_asserteq_str("test string", val[0]);
  505. ut_assertnull(val[1]);
  506. free(val);
  507. /* list of strings */
  508. ut_asserteq(5, ofnode_read_string_count(node, "mux-control-names"));
  509. ut_assertok(ofnode_read_string_index(node, "mux-control-names", 0,
  510. &out));
  511. ut_asserteq_str("mux0", out);
  512. ut_asserteq(0, ofnode_stringlist_search(node, "mux-control-names",
  513. "mux0"));
  514. ut_asserteq(5, ofnode_read_string_list(node, "mux-control-names",
  515. &val));
  516. ut_asserteq_str("mux0", val[0]);
  517. ut_asserteq_str("mux1", val[1]);
  518. ut_asserteq_str("mux2", val[2]);
  519. ut_asserteq_str("mux3", val[3]);
  520. ut_asserteq_str("mux4", val[4]);
  521. ut_assertnull(val[5]);
  522. free(val);
  523. ut_assertok(ofnode_read_string_index(node, "mux-control-names", 4,
  524. &out));
  525. ut_asserteq_str("mux4", out);
  526. ut_asserteq(4, ofnode_stringlist_search(node, "mux-control-names",
  527. "mux4"));
  528. return 0;
  529. }
  530. DM_TEST(dm_test_ofnode_string, 0);
  531. static int dm_test_ofnode_string_err(struct unit_test_state *uts)
  532. {
  533. const char **val;
  534. const char *out;
  535. ofnode node;
  536. /*
  537. * Test error codes only on livetree, as they are different with
  538. * flattree
  539. */
  540. node = ofnode_path("/a-test");
  541. ut_assert(ofnode_valid(node));
  542. /* non-existent property */
  543. ut_asserteq(-EINVAL, ofnode_read_string_count(node, "missing"));
  544. ut_asserteq(-EINVAL, ofnode_read_string_index(node, "missing", 0,
  545. &out));
  546. ut_asserteq(-EINVAL, ofnode_read_string_list(node, "missing", &val));
  547. /* empty property */
  548. ut_asserteq(-ENODATA, ofnode_read_string_count(node, "bool-value"));
  549. ut_asserteq(-ENODATA, ofnode_read_string_index(node, "bool-value", 0,
  550. &out));
  551. ut_asserteq(-ENODATA, ofnode_read_string_list(node, "bool-value",
  552. &val));
  553. /* badly formatted string list */
  554. ut_asserteq(-EILSEQ, ofnode_read_string_count(node, "int64-value"));
  555. ut_asserteq(-EILSEQ, ofnode_read_string_index(node, "int64-value", 0,
  556. &out));
  557. ut_asserteq(-EILSEQ, ofnode_read_string_list(node, "int64-value",
  558. &val));
  559. /* out of range / not found */
  560. ut_asserteq(-ENODATA, ofnode_read_string_index(node, "str-value", 1,
  561. &out));
  562. ut_asserteq(-ENODATA, ofnode_stringlist_search(node, "str-value",
  563. "other"));
  564. /* negative value for index is not allowed, so don't test for that */
  565. ut_asserteq(-ENODATA, ofnode_read_string_index(node,
  566. "mux-control-names", 5,
  567. &out));
  568. return 0;
  569. }
  570. DM_TEST(dm_test_ofnode_string_err, UT_TESTF_LIVE_TREE);
  571. static int dm_test_ofnode_get_phy(struct unit_test_state *uts)
  572. {
  573. ofnode eth_node, phy_node;
  574. phy_interface_t mode;
  575. u32 reg;
  576. eth_node = ofnode_path("/phy-test-eth");
  577. ut_assert(ofnode_valid(eth_node));
  578. mode = ofnode_read_phy_mode(eth_node);
  579. ut_assert(mode == PHY_INTERFACE_MODE_2500BASEX);
  580. phy_node = ofnode_get_phy_node(eth_node);
  581. ut_assert(ofnode_valid(phy_node));
  582. reg = ofnode_read_u32_default(phy_node, "reg", -1U);
  583. ut_asserteq_64(0x1, reg);
  584. return 0;
  585. }
  586. DM_TEST(dm_test_ofnode_get_phy, 0);
  587. /**
  588. * make_ofnode_fdt() - Create an FDT for testing with ofnode
  589. *
  590. * The size is set to the minimum needed
  591. *
  592. * @uts: Test state
  593. * @fdt: Place to write FDT
  594. * @size: Maximum size of space for fdt
  595. * @id: id value to add to the tree ('id' property in root node)
  596. */
  597. static int make_ofnode_fdt(struct unit_test_state *uts, void *fdt, int size,
  598. int id)
  599. {
  600. ut_assertok(fdt_create(fdt, size));
  601. ut_assertok(fdt_finish_reservemap(fdt));
  602. ut_assert(fdt_begin_node(fdt, "") >= 0);
  603. ut_assertok(fdt_property_u32(fdt, "id", id));
  604. ut_assert(fdt_begin_node(fdt, "aliases") >= 0);
  605. ut_assertok(fdt_property_string(fdt, "mmc0", "/new-mmc"));
  606. ut_assertok(fdt_end_node(fdt));
  607. ut_assert(fdt_begin_node(fdt, "new-mmc") >= 0);
  608. ut_assertok(fdt_end_node(fdt));
  609. ut_assertok(fdt_end_node(fdt));
  610. ut_assertok(fdt_finish(fdt));
  611. return 0;
  612. }
  613. static int dm_test_ofnode_root(struct unit_test_state *uts)
  614. {
  615. ofnode node;
  616. /* Check that aliases work on the control FDT */
  617. node = ofnode_get_aliases_node("ethernet3");
  618. ut_assert(ofnode_valid(node));
  619. ut_asserteq_str("sbe5", ofnode_get_name(node));
  620. ut_assert(!oftree_valid(oftree_null()));
  621. return 0;
  622. }
  623. DM_TEST(dm_test_ofnode_root, UT_TESTF_SCAN_FDT);
  624. static int dm_test_ofnode_root_mult(struct unit_test_state *uts)
  625. {
  626. char fdt[256];
  627. oftree tree;
  628. ofnode node;
  629. /* skip this test if multiple FDTs are not supported */
  630. if (!IS_ENABLED(CONFIG_OFNODE_MULTI_TREE))
  631. return -EAGAIN;
  632. ut_assertok(make_ofnode_fdt(uts, fdt, sizeof(fdt), 0));
  633. ut_assertok(get_oftree(uts, fdt, &tree));
  634. ut_assert(oftree_valid(tree));
  635. /* Make sure they don't work on this new tree */
  636. node = oftree_path(tree, "mmc0");
  637. ut_assert(!ofnode_valid(node));
  638. /* It should appear in the new tree */
  639. node = oftree_path(tree, "/new-mmc");
  640. ut_assert(ofnode_valid(node));
  641. /* ...and not in the control FDT */
  642. node = oftree_path(oftree_default(), "/new-mmc");
  643. ut_assert(!ofnode_valid(node));
  644. free_oftree(tree);
  645. return 0;
  646. }
  647. DM_TEST(dm_test_ofnode_root_mult, UT_TESTF_SCAN_FDT);
  648. static int dm_test_ofnode_livetree_writing(struct unit_test_state *uts)
  649. {
  650. struct udevice *dev;
  651. ofnode node;
  652. /* Test enabling devices */
  653. node = ofnode_path("/usb@2");
  654. ut_assert(!ofnode_is_enabled(node));
  655. ut_assertok(ofnode_set_enabled(node, true));
  656. ut_asserteq(true, ofnode_is_enabled(node));
  657. device_bind_driver_to_node(dm_root(), "usb_sandbox", "usb@2", node,
  658. &dev);
  659. ut_assertok(uclass_find_device_by_seq(UCLASS_USB, 2, &dev));
  660. /* Test string property setting */
  661. ut_assert(device_is_compatible(dev, "sandbox,usb"));
  662. ofnode_write_string(node, "compatible", "gdsys,super-usb");
  663. ut_assert(device_is_compatible(dev, "gdsys,super-usb"));
  664. ofnode_write_string(node, "compatible", "sandbox,usb");
  665. ut_assert(device_is_compatible(dev, "sandbox,usb"));
  666. /* Test setting generic properties */
  667. /* Non-existent in DTB */
  668. ut_asserteq_64(FDT_ADDR_T_NONE, dev_read_addr(dev));
  669. /* reg = 0x42, size = 0x100 */
  670. ut_assertok(ofnode_write_prop(node, "reg",
  671. "\x00\x00\x00\x42\x00\x00\x01\x00", 8,
  672. false));
  673. ut_asserteq(0x42, dev_read_addr(dev));
  674. /* Test disabling devices */
  675. device_remove(dev, DM_REMOVE_NORMAL);
  676. device_unbind(dev);
  677. ut_assert(ofnode_is_enabled(node));
  678. ut_assertok(ofnode_set_enabled(node, false));
  679. ut_assert(!ofnode_is_enabled(node));
  680. return 0;
  681. }
  682. DM_TEST(dm_test_ofnode_livetree_writing,
  683. UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  684. static int check_write_prop(struct unit_test_state *uts, ofnode node)
  685. {
  686. char prop[] = "middle-name";
  687. char name[10];
  688. int len;
  689. strcpy(name, "cecil");
  690. len = strlen(name) + 1;
  691. ut_assertok(ofnode_write_prop(node, prop, name, len, false));
  692. ut_asserteq_str(name, ofnode_read_string(node, prop));
  693. /* change the underlying value, this should mess up the live tree */
  694. strcpy(name, "tony");
  695. if (of_live_active()) {
  696. ut_asserteq_str(name, ofnode_read_string(node, prop));
  697. } else {
  698. ut_asserteq_str("cecil", ofnode_read_string(node, prop));
  699. }
  700. /* try again, this time copying the property */
  701. strcpy(name, "mary");
  702. ut_assertok(ofnode_write_prop(node, prop, name, len, true));
  703. ut_asserteq_str(name, ofnode_read_string(node, prop));
  704. strcpy(name, "leah");
  705. /* both flattree and livetree behave the same */
  706. ut_asserteq_str("mary", ofnode_read_string(node, prop));
  707. return 0;
  708. }
  709. /* writing the tree with and without copying the property */
  710. static int dm_test_ofnode_write_copy(struct unit_test_state *uts)
  711. {
  712. ofnode node;
  713. node = ofnode_path("/a-test");
  714. ut_assertok(check_write_prop(uts, node));
  715. return 0;
  716. }
  717. DM_TEST(dm_test_ofnode_write_copy, UT_TESTF_SCAN_FDT);
  718. static int dm_test_ofnode_write_copy_ot(struct unit_test_state *uts)
  719. {
  720. oftree otree = get_other_oftree(uts);
  721. ofnode node, check_node;
  722. node = oftree_path(otree, "/node");
  723. ut_assertok(check_write_prop(uts, node));
  724. /* make sure the control FDT is not touched */
  725. check_node = ofnode_path("/node");
  726. ut_assertnull(ofnode_read_string(check_node, "middle-name"));
  727. return 0;
  728. }
  729. DM_TEST(dm_test_ofnode_write_copy_ot, UT_TESTF_OTHER_FDT);
  730. static int dm_test_ofnode_u32(struct unit_test_state *uts)
  731. {
  732. ofnode node;
  733. u32 val;
  734. node = ofnode_path("/lcd");
  735. ut_assert(ofnode_valid(node));
  736. ut_asserteq(1366, ofnode_read_u32_default(node, "xres", 123));
  737. ut_assertok(ofnode_write_u32(node, "xres", 1367));
  738. ut_asserteq(1367, ofnode_read_u32_default(node, "xres", 123));
  739. ut_assertok(ofnode_write_u32(node, "xres", 1366));
  740. node = ofnode_path("/backlight");
  741. ut_assertok(ofnode_read_u32_index(node, "brightness-levels", 0, &val));
  742. ut_asserteq(0, val);
  743. ut_assertok(ofnode_read_u32_index(node, "brightness-levels", 1, &val));
  744. ut_asserteq(16, val);
  745. ut_assertok(ofnode_read_u32_index(node, "brightness-levels", 8, &val));
  746. ut_asserteq(255, val);
  747. ut_asserteq(-EOVERFLOW,
  748. ofnode_read_u32_index(node, "brightness-levels", 9, &val));
  749. ut_asserteq(-EINVAL, ofnode_read_u32_index(node, "missing", 0, &val));
  750. return 0;
  751. }
  752. DM_TEST(dm_test_ofnode_u32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  753. static int dm_test_ofnode_u32_array(struct unit_test_state *uts)
  754. {
  755. ofnode node;
  756. u32 val[10];
  757. node = ofnode_path("/a-test");
  758. ut_assert(ofnode_valid(node));
  759. ut_assertok(ofnode_read_u32_array(node, "int-value", val, 1));
  760. ut_asserteq(-EINVAL, ofnode_read_u32_array(node, "missing", val, 1));
  761. ut_asserteq(-EOVERFLOW, ofnode_read_u32_array(node, "bool-value", val,
  762. 1));
  763. memset(val, '\0', sizeof(val));
  764. ut_assertok(ofnode_read_u32_array(node, "int-array", val + 1, 3));
  765. ut_asserteq(0, val[0]);
  766. ut_asserteq(5678, val[1]);
  767. ut_asserteq(9123, val[2]);
  768. ut_asserteq(4567, val[3]);
  769. ut_asserteq(0, val[4]);
  770. ut_asserteq(-EOVERFLOW, ofnode_read_u32_array(node, "int-array", val,
  771. 4));
  772. return 0;
  773. }
  774. DM_TEST(dm_test_ofnode_u32_array, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  775. static int dm_test_ofnode_u64(struct unit_test_state *uts)
  776. {
  777. ofnode node;
  778. u64 val;
  779. node = ofnode_path("/a-test");
  780. ut_assert(ofnode_valid(node));
  781. ut_assertok(ofnode_read_u64(node, "int64-value", &val));
  782. ut_asserteq_64(0x1111222233334444, val);
  783. ut_asserteq(-EINVAL, ofnode_read_u64(node, "missing", &val));
  784. return 0;
  785. }
  786. DM_TEST(dm_test_ofnode_u64, UT_TESTF_SCAN_FDT);
  787. static int dm_test_ofnode_add_subnode(struct unit_test_state *uts)
  788. {
  789. ofnode node, check, subnode;
  790. char buf[128];
  791. node = ofnode_path("/lcd");
  792. ut_assert(ofnode_valid(node));
  793. ut_assertok(ofnode_add_subnode(node, "edmund", &subnode));
  794. check = ofnode_path("/lcd/edmund");
  795. ut_asserteq(subnode.of_offset, check.of_offset);
  796. ut_assertok(ofnode_get_path(subnode, buf, sizeof(buf)));
  797. ut_asserteq_str("/lcd/edmund", buf);
  798. if (of_live_active()) {
  799. struct device_node *child;
  800. ut_assertok(of_add_subnode((void *)ofnode_to_np(node), "edmund",
  801. 2, &child));
  802. ut_asserteq_str("ed", child->name);
  803. ut_asserteq_str("/lcd/ed", child->full_name);
  804. check = ofnode_path("/lcd/ed");
  805. ut_asserteq_ptr(child, check.np);
  806. ut_assertok(ofnode_get_path(np_to_ofnode(child), buf,
  807. sizeof(buf)));
  808. ut_asserteq_str("/lcd/ed", buf);
  809. }
  810. /* An existing node should be returned with -EEXIST */
  811. ut_asserteq(-EEXIST, ofnode_add_subnode(node, "edmund", &check));
  812. ut_asserteq(subnode.of_offset, check.of_offset);
  813. /* add a root node */
  814. node = ofnode_path("/");
  815. ut_assert(ofnode_valid(node));
  816. ut_assertok(ofnode_add_subnode(node, "lcd2", &subnode));
  817. check = ofnode_path("/lcd2");
  818. ut_asserteq(subnode.of_offset, check.of_offset);
  819. ut_assertok(ofnode_get_path(subnode, buf, sizeof(buf)));
  820. ut_asserteq_str("/lcd2", buf);
  821. if (of_live_active()) {
  822. ulong start;
  823. int i;
  824. /*
  825. * Make sure each of the three malloc()checks in
  826. * of_add_subnode() work
  827. */
  828. for (i = 0; i < 3; i++) {
  829. malloc_enable_testing(i);
  830. start = ut_check_free();
  831. ut_asserteq(-ENOMEM, ofnode_add_subnode(node, "anthony",
  832. &check));
  833. ut_assertok(ut_check_delta(start));
  834. }
  835. /* This should pass since we allow 3 allocations */
  836. malloc_enable_testing(3);
  837. ut_assertok(ofnode_add_subnode(node, "anthony", &check));
  838. malloc_disable_testing();
  839. }
  840. /* write to the empty node */
  841. ut_assertok(ofnode_write_string(subnode, "example", "text"));
  842. return 0;
  843. }
  844. DM_TEST(dm_test_ofnode_add_subnode, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
  845. static int dm_test_ofnode_for_each_prop(struct unit_test_state *uts)
  846. {
  847. ofnode node, subnode;
  848. struct ofprop prop;
  849. int count;
  850. node = ofnode_path("/ofnode-foreach");
  851. count = 0;
  852. /* we expect "compatible" for each node */
  853. ofnode_for_each_prop(prop, node)
  854. count++;
  855. ut_asserteq(1, count);
  856. /* there are two nodes, each with 2 properties */
  857. ofnode_for_each_subnode(subnode, node)
  858. ofnode_for_each_prop(prop, subnode)
  859. count++;
  860. ut_asserteq(5, count);
  861. return 0;
  862. }
  863. DM_TEST(dm_test_ofnode_for_each_prop, UT_TESTF_SCAN_FDT);
  864. static int dm_test_ofnode_by_compatible(struct unit_test_state *uts)
  865. {
  866. const char *compat = "denx,u-boot-fdt-test";
  867. ofnode node;
  868. int count;
  869. count = 0;
  870. for (node = ofnode_null();
  871. node = ofnode_by_compatible(node, compat), ofnode_valid(node);)
  872. count++;
  873. ut_asserteq(11, count);
  874. return 0;
  875. }
  876. DM_TEST(dm_test_ofnode_by_compatible, UT_TESTF_SCAN_FDT);
  877. static int dm_test_ofnode_by_compatible_ot(struct unit_test_state *uts)
  878. {
  879. const char *compat = "sandbox-other2";
  880. oftree otree = get_other_oftree(uts);
  881. ofnode node;
  882. int count;
  883. count = 0;
  884. for (node = oftree_root(otree);
  885. node = ofnode_by_compatible(node, compat), ofnode_valid(node);)
  886. count++;
  887. ut_asserteq(2, count);
  888. return 0;
  889. }
  890. DM_TEST(dm_test_ofnode_by_compatible_ot, UT_TESTF_OTHER_FDT);
  891. static int dm_test_ofnode_find_subnode(struct unit_test_state *uts)
  892. {
  893. ofnode node, subnode;
  894. node = ofnode_path("/buttons");
  895. subnode = ofnode_find_subnode(node, "btn1");
  896. ut_assert(ofnode_valid(subnode));
  897. ut_asserteq_str("btn1", ofnode_get_name(subnode));
  898. subnode = ofnode_find_subnode(node, "btn");
  899. ut_assert(!ofnode_valid(subnode));
  900. return 0;
  901. }
  902. DM_TEST(dm_test_ofnode_find_subnode, UT_TESTF_SCAN_FDT);
  903. static int dm_test_ofnode_find_subnode_ot(struct unit_test_state *uts)
  904. {
  905. oftree otree = get_other_oftree(uts);
  906. ofnode node, subnode;
  907. node = oftree_path(otree, "/node");
  908. subnode = ofnode_find_subnode(node, "subnode");
  909. ut_assert(ofnode_valid(subnode));
  910. ut_asserteq_str("subnode", ofnode_get_name(subnode));
  911. subnode = ofnode_find_subnode(node, "btn");
  912. ut_assert(!ofnode_valid(subnode));
  913. return 0;
  914. }
  915. DM_TEST(dm_test_ofnode_find_subnode_ot, UT_TESTF_OTHER_FDT);
  916. static int dm_test_ofnode_get_name(struct unit_test_state *uts)
  917. {
  918. ofnode node;
  919. node = ofnode_path("/buttons");
  920. ut_assert(ofnode_valid(node));
  921. ut_asserteq_str("buttons", ofnode_get_name(node));
  922. ut_asserteq_str("", ofnode_get_name(ofnode_root()));
  923. return 0;
  924. }
  925. DM_TEST(dm_test_ofnode_get_name, UT_TESTF_SCAN_FDT);
  926. /* try to access more FDTs than is supported */
  927. static int dm_test_ofnode_too_many(struct unit_test_state *uts)
  928. {
  929. const int max_trees = CONFIG_IS_ENABLED(OFNODE_MULTI_TREE,
  930. (CONFIG_OFNODE_MULTI_TREE_MAX), (1));
  931. const int fdt_size = 256;
  932. const int num_trees = max_trees + 1;
  933. char fdt[num_trees][fdt_size];
  934. int i;
  935. for (i = 0; i < num_trees; i++) {
  936. oftree tree;
  937. int ret;
  938. ut_assertok(make_ofnode_fdt(uts, fdt[i], fdt_size, i));
  939. ret = get_oftree(uts, fdt[i], &tree);
  940. /*
  941. * With flat tree we have the control FDT using one slot. Live
  942. * tree has no limit since it uses pointers, not integer tree
  943. * IDs
  944. */
  945. if (of_live_active() || i < max_trees - 1) {
  946. ut_assertok(ret);
  947. } else {
  948. /*
  949. * tree should be invalid when we try to register too
  950. * many trees
  951. */
  952. ut_asserteq(-EOVERFLOW, ret);
  953. }
  954. }
  955. return 0;
  956. }
  957. DM_TEST(dm_test_ofnode_too_many, UT_TESTF_SCAN_FDT);
  958. static int check_copy_props(struct unit_test_state *uts, ofnode src,
  959. ofnode dst)
  960. {
  961. u32 reg[2], val;
  962. ut_assertok(ofnode_copy_props(src, dst));
  963. ut_assertok(ofnode_read_u32(dst, "ping-expect", &val));
  964. ut_asserteq(3, val);
  965. ut_asserteq_str("denx,u-boot-fdt-test",
  966. ofnode_read_string(dst, "compatible"));
  967. /* check that a property with the same name is overwritten */
  968. ut_assertok(ofnode_read_u32_array(dst, "reg", reg, ARRAY_SIZE(reg)));
  969. ut_asserteq(3, reg[0]);
  970. ut_asserteq(1, reg[1]);
  971. /* reset the compatible so the live tree does not change */
  972. ut_assertok(ofnode_write_string(dst, "compatible", "nothing"));
  973. return 0;
  974. }
  975. static int dm_test_ofnode_copy_props(struct unit_test_state *uts)
  976. {
  977. ofnode src, dst;
  978. /*
  979. * These nodes are chosen so that the src node is before the destination
  980. * node in the tree. This doesn't matter with livetree, but with
  981. * flattree any attempt to insert a property earlier in the tree will
  982. * mess up the offsets after it.
  983. */
  984. src = ofnode_path("/b-test");
  985. dst = ofnode_path("/some-bus");
  986. ut_assertok(check_copy_props(uts, src, dst));
  987. /* check a property that is in the destination already */
  988. ut_asserteq_str("mux0", ofnode_read_string(dst, "mux-control-names"));
  989. return 0;
  990. }
  991. DM_TEST(dm_test_ofnode_copy_props, UT_TESTF_SCAN_FDT);
  992. static int dm_test_ofnode_copy_props_ot(struct unit_test_state *uts)
  993. {
  994. ofnode src, dst;
  995. oftree otree = get_other_oftree(uts);
  996. src = ofnode_path("/b-test");
  997. dst = oftree_path(otree, "/node/subnode2");
  998. ut_assertok(check_copy_props(uts, src, dst));
  999. return 0;
  1000. }
  1001. DM_TEST(dm_test_ofnode_copy_props_ot, UT_TESTF_SCAN_FDT | UT_TESTF_OTHER_FDT);
  1002. /* check that the livetree is aligned to a structure boundary */
  1003. static int dm_test_livetree_align(struct unit_test_state *uts)
  1004. {
  1005. const int align = __alignof__(struct unit_test_state);
  1006. struct device_node *node;
  1007. u32 *sentinel;
  1008. ulong start;
  1009. start = (ulong)gd_of_root();
  1010. ut_asserteq(start, ALIGN(start, align));
  1011. node = gd_of_root();
  1012. sentinel = (void *)node - sizeof(u32);
  1013. /*
  1014. * The sentinel should be overwritten with the root node. If it isn't,
  1015. * then the root node is not at the very start of the livetree memory
  1016. * area, and free(root) will fail to free the memory used by the
  1017. * livetree.
  1018. */
  1019. ut_assert(*sentinel != BAD_OF_ROOT);
  1020. return 0;
  1021. }
  1022. DM_TEST(dm_test_livetree_align, UT_TESTF_LIVE_TREE);
  1023. /* check that it is possible to load an arbitrary livetree */
  1024. static int dm_test_livetree_ensure(struct unit_test_state *uts)
  1025. {
  1026. oftree tree;
  1027. ofnode node;
  1028. /* read from other.dtb */
  1029. ut_assertok(test_load_other_fdt(uts));
  1030. tree = oftree_from_fdt(uts->other_fdt);
  1031. ut_assert(oftree_valid(tree));
  1032. node = oftree_path(tree, "/node/subnode");
  1033. ut_assert(ofnode_valid(node));
  1034. ut_asserteq_str("sandbox-other2",
  1035. ofnode_read_string(node, "compatible"));
  1036. return 0;
  1037. }
  1038. DM_TEST(dm_test_livetree_ensure, 0);