bdinfo.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Tests for bdinfo command
  4. *
  5. * Copyright 2023 Marek Vasut <marek.vasut+renesas@mailbox.org>
  6. */
  7. #include <common.h>
  8. #include <console.h>
  9. #include <mapmem.h>
  10. #include <asm/global_data.h>
  11. #include <dm/uclass.h>
  12. #include <test/suites.h>
  13. #include <test/ut.h>
  14. #include <dm.h>
  15. #include <env.h>
  16. #include <lmb.h>
  17. #include <net.h>
  18. #include <serial.h>
  19. #include <video.h>
  20. #include <vsprintf.h>
  21. #include <asm/cache.h>
  22. #include <asm/global_data.h>
  23. #include <display_options.h>
  24. DECLARE_GLOBAL_DATA_PTR;
  25. /* Declare a new bdinfo test */
  26. #define BDINFO_TEST(_name, _flags) UNIT_TEST(_name, _flags, bdinfo_test)
  27. static int test_num_l(struct unit_test_state *uts, const char *name,
  28. ulong value)
  29. {
  30. ut_assert_nextline("%-12s= 0x%0*lx", name, 2 * (int)sizeof(value),
  31. value);
  32. return 0;
  33. }
  34. static int test_num_ll(struct unit_test_state *uts, const char *name,
  35. unsigned long long value)
  36. {
  37. ut_assert_nextline("%-12s= 0x%.*llx", name, 2 * (int)sizeof(ulong),
  38. value);
  39. return 0;
  40. }
  41. static int test_eth(struct unit_test_state *uts)
  42. {
  43. const int idx = eth_get_dev_index();
  44. uchar enetaddr[6];
  45. char name[10];
  46. int ret;
  47. if (idx)
  48. sprintf(name, "eth%iaddr", idx);
  49. else
  50. strcpy(name, "ethaddr");
  51. ret = eth_env_get_enetaddr_by_index("eth", idx, enetaddr);
  52. ut_assert_nextline("current eth = %s", eth_get_name());
  53. if (!ret)
  54. ut_assert_nextline("%-12s= (not set)", name);
  55. else
  56. ut_assert_nextline("%-12s= %pM", name, enetaddr);
  57. ut_assert_nextline("IP addr = %s", env_get("ipaddr"));
  58. return 0;
  59. }
  60. static int test_video_info(struct unit_test_state *uts)
  61. {
  62. const struct udevice *dev;
  63. struct uclass *uc;
  64. uclass_id_foreach_dev(UCLASS_VIDEO, dev, uc) {
  65. ut_assert_nextline("%-12s= %s %sactive", "Video", dev->name,
  66. device_active(dev) ? "" : "in");
  67. if (device_active(dev)) {
  68. struct video_priv *upriv = dev_get_uclass_priv(dev);
  69. struct video_uc_plat *plat = dev_get_uclass_plat(dev);
  70. ut_assertok(test_num_ll(uts, "FB base",
  71. (ulong)upriv->fb));
  72. if (upriv->copy_fb) {
  73. ut_assertok(test_num_ll(uts, "FB copy",
  74. (ulong)upriv->copy_fb));
  75. ut_assertok(test_num_l(uts, " copy size",
  76. plat->copy_size));
  77. }
  78. ut_assert_nextline("%-12s= %dx%dx%d", "FB size",
  79. upriv->xsize, upriv->ysize,
  80. 1 << upriv->bpix);
  81. }
  82. }
  83. return 0;
  84. }
  85. static int lmb_test_dump_region(struct unit_test_state *uts,
  86. struct lmb_region *rgn, char *name)
  87. {
  88. unsigned long long base, size, end;
  89. enum lmb_flags flags;
  90. int i;
  91. ut_assert_nextline(" %s.cnt = 0x%lx / max = 0x%lx", name, rgn->cnt, rgn->max);
  92. for (i = 0; i < rgn->cnt; i++) {
  93. base = rgn->region[i].base;
  94. size = rgn->region[i].size;
  95. end = base + size - 1;
  96. flags = rgn->region[i].flags;
  97. ut_assert_nextline(" %s[%d]\t[0x%llx-0x%llx], 0x%08llx bytes flags: %x",
  98. name, i, base, end, size, flags);
  99. }
  100. return 0;
  101. }
  102. static int lmb_test_dump_all(struct unit_test_state *uts, struct lmb *lmb)
  103. {
  104. ut_assert_nextline("lmb_dump_all:");
  105. lmb_test_dump_region(uts, &lmb->memory, "memory");
  106. lmb_test_dump_region(uts, &lmb->reserved, "reserved");
  107. return 0;
  108. }
  109. static int bdinfo_test_move(struct unit_test_state *uts)
  110. {
  111. struct bd_info *bd = gd->bd;
  112. int i;
  113. /* Test moving the working BDINFO to a new location */
  114. ut_assertok(console_record_reset_enable());
  115. ut_assertok(run_commandf("bdinfo"));
  116. ut_assertok(test_num_l(uts, "boot_params", 0));
  117. for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
  118. if (bd->bi_dram[i].size) {
  119. ut_assertok(test_num_l(uts, "DRAM bank", i));
  120. ut_assertok(test_num_ll(uts, "-> start",
  121. bd->bi_dram[i].start));
  122. ut_assertok(test_num_ll(uts, "-> size",
  123. bd->bi_dram[i].size));
  124. }
  125. }
  126. /* CONFIG_SYS_HAS_SRAM testing not supported */
  127. ut_assertok(test_num_l(uts, "flashstart", 0));
  128. ut_assertok(test_num_l(uts, "flashsize", 0));
  129. ut_assertok(test_num_l(uts, "flashoffset", 0));
  130. ut_assert_nextline("baudrate = %lu bps",
  131. env_get_ulong("baudrate", 10, 1234));
  132. ut_assertok(test_num_l(uts, "relocaddr", gd->relocaddr));
  133. ut_assertok(test_num_l(uts, "reloc off", gd->reloc_off));
  134. ut_assert_nextline("%-12s= %u-bit", "Build", (uint)sizeof(void *) * 8);
  135. if (IS_ENABLED(CONFIG_CMD_NET))
  136. ut_assertok(test_eth(uts));
  137. /*
  138. * Make sure environment variable "fdtcontroladdr" address
  139. * matches mapped control DT address.
  140. */
  141. ut_assert(map_to_sysmem(gd->fdt_blob) == env_get_hex("fdtcontroladdr", 0x1234));
  142. ut_assertok(test_num_l(uts, "fdt_blob",
  143. (ulong)map_to_sysmem(gd->fdt_blob)));
  144. ut_assertok(test_num_l(uts, "new_fdt",
  145. (ulong)map_to_sysmem(gd->new_fdt)));
  146. ut_assertok(test_num_l(uts, "fdt_size", (ulong)gd->fdt_size));
  147. if (IS_ENABLED(CONFIG_VIDEO))
  148. test_video_info(uts);
  149. /* The gd->multi_dtb_fit may not be available, hence, #if below. */
  150. #if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
  151. ut_assertok(test_num_l(uts, "multi_dtb_fit", (ulong)gd->multi_dtb_fit));
  152. #endif
  153. if (IS_ENABLED(CONFIG_LMB) && gd->fdt_blob) {
  154. struct lmb lmb;
  155. lmb_init_and_reserve(&lmb, gd->bd, (void *)gd->fdt_blob);
  156. lmb_test_dump_all(uts, &lmb);
  157. if (IS_ENABLED(CONFIG_OF_REAL))
  158. ut_assert_nextline("devicetree = %s", fdtdec_get_srcname());
  159. }
  160. if (IS_ENABLED(CONFIG_DM_SERIAL)) {
  161. struct serial_device_info info;
  162. ut_assertnonnull(gd->cur_serial_dev);
  163. ut_assertok(serial_getinfo(gd->cur_serial_dev, &info));
  164. ut_assertok(test_num_l(uts, "serial addr", info.addr));
  165. ut_assertok(test_num_l(uts, " width", info.reg_width));
  166. ut_assertok(test_num_l(uts, " shift", info.reg_shift));
  167. ut_assertok(test_num_l(uts, " offset", info.reg_offset));
  168. ut_assertok(test_num_l(uts, " clock", info.clock));
  169. }
  170. if (IS_ENABLED(CONFIG_CMD_BDINFO_EXTRA)) {
  171. ut_assert_nextlinen("stack ptr");
  172. ut_assertok(test_num_ll(uts, "ram_top ptr",
  173. (unsigned long long)gd->ram_top));
  174. ut_assertok(test_num_l(uts, "malloc base", gd_malloc_start()));
  175. }
  176. ut_assertok(ut_check_console_end(uts));
  177. return 0;
  178. }
  179. BDINFO_TEST(bdinfo_test_move, UT_TESTF_CONSOLE_REC);
  180. int do_ut_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  181. {
  182. struct unit_test *tests = UNIT_TEST_SUITE_START(bdinfo_test);
  183. const int n_ents = UNIT_TEST_SUITE_COUNT(bdinfo_test);
  184. return cmd_ut_category("bdinfo", "bdinfo_test_", tests, n_ents, argc, argv);
  185. }