1 // SPDX-License-Identifier: GPL-2.0+
3 * Tests for bdinfo command
11 #include <asm/global_data.h>
12 #include <dm/uclass.h>
13 #include <test/suites.h>
22 #include <asm/cache.h>
23 #include <asm/global_data.h>
24 #include <display_options.h>
26 DECLARE_GLOBAL_DATA_PTR;
28 /* Declare a new bdinfo test */
29 #define BDINFO_TEST(_name, _flags) UNIT_TEST(_name, _flags, bdinfo_test)
31 static int test_num_l(struct unit_test_state *uts, const char *name,
34 ut_assert_nextline("%-12s= 0x%0*lx", name, 2 * (int)sizeof(value),
40 static int test_num_ll(struct unit_test_state *uts, const char *name,
41 unsigned long long value)
43 ut_assert_nextline("%-12s= 0x%.*llx", name, 2 * (int)sizeof(ulong),
49 static int test_eth(struct unit_test_state *uts)
51 const int idx = eth_get_dev_index();
57 sprintf(name, "eth%iaddr", idx);
59 strcpy(name, "ethaddr");
61 ret = eth_env_get_enetaddr_by_index("eth", idx, enetaddr);
63 ut_assert_nextline("current eth = %s", eth_get_name());
65 ut_assert_nextline("%-12s= (not set)", name);
67 ut_assert_nextline("%-12s= %pM", name, enetaddr);
68 ut_assert_nextline("IP addr = %s", env_get("ipaddr"));
73 static int test_video_info(struct unit_test_state *uts)
75 const struct udevice *dev;
78 uclass_id_foreach_dev(UCLASS_VIDEO, dev, uc) {
79 ut_assert_nextline("%-12s= %s %sactive", "Video", dev->name,
80 device_active(dev) ? "" : "in");
81 if (device_active(dev)) {
82 struct video_priv *upriv = dev_get_uclass_priv(dev);
83 struct video_uc_plat *plat = dev_get_uclass_plat(dev);
85 ut_assertok(test_num_ll(uts, "FB base",
88 ut_assertok(test_num_ll(uts, "FB copy",
89 (ulong)upriv->copy_fb));
90 ut_assertok(test_num_l(uts, " copy size",
93 ut_assert_nextline("%-12s= %dx%dx%d", "FB size",
94 upriv->xsize, upriv->ysize,
102 static int lmb_test_dump_region(struct unit_test_state *uts,
103 struct alist *lmb_rgn_lst, char *name)
105 struct lmb_region *rgn = lmb_rgn_lst->data;
106 unsigned long long base, size, end;
107 enum lmb_flags flags;
110 ut_assert_nextline(" %s.count = %#x", name, lmb_rgn_lst->count);
112 for (i = 0; i < lmb_rgn_lst->count; i++) {
115 end = base + size - 1;
116 flags = rgn[i].flags;
118 if (!IS_ENABLED(CONFIG_SANDBOX) && i == 3) {
119 ut_assert_nextlinen(" %s[%d]\t[", name, i);
122 ut_assert_nextlinen(" %s[%d]\t[%#llx-%#llx], %#llx bytes, flags: ",
123 name, i, base, end, size);
129 static int lmb_test_dump_all(struct unit_test_state *uts)
131 struct lmb *lmb = lmb_get();
133 ut_assert_nextline("lmb_dump_all:");
134 ut_assertok(lmb_test_dump_region(uts, &lmb->free_mem, "memory"));
135 ut_assertok(lmb_test_dump_region(uts, &lmb->used_mem, "reserved"));
140 static int bdinfo_check_mem(struct unit_test_state *uts)
142 struct bd_info *bd = gd->bd;
145 for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
146 if (bd->bi_dram[i].size) {
147 ut_assertok(test_num_l(uts, "DRAM bank", i));
148 ut_assertok(test_num_ll(uts, "-> start",
149 bd->bi_dram[i].start));
150 ut_assertok(test_num_ll(uts, "-> size",
151 bd->bi_dram[i].size));
158 static int bdinfo_test_all(struct unit_test_state *uts)
160 ut_assertok(test_num_l(uts, "boot_params", 0));
162 ut_assertok(bdinfo_check_mem(uts));
164 /* CONFIG_SYS_HAS_SRAM testing not supported */
165 ut_assertok(test_num_l(uts, "flashstart", 0));
166 ut_assertok(test_num_l(uts, "flashsize", 0));
167 ut_assertok(test_num_l(uts, "flashoffset", 0));
168 ut_assert_nextline("baudrate = %lu bps",
169 env_get_ulong("baudrate", 10, 1234));
170 ut_assertok(test_num_l(uts, "relocaddr", gd->relocaddr));
171 ut_assertok(test_num_l(uts, "reloc off", gd->reloc_off));
172 ut_assert_nextline("%-12s= %u-bit", "Build", (uint)sizeof(void *) * 8);
174 if (IS_ENABLED(CONFIG_CMD_NET))
175 ut_assertok(test_eth(uts));
178 * Make sure environment variable "fdtcontroladdr" address
179 * matches mapped control DT address.
181 ut_assert(map_to_sysmem(gd->fdt_blob) == env_get_hex("fdtcontroladdr", 0x1234));
182 ut_assertok(test_num_l(uts, "fdt_blob",
183 (ulong)map_to_sysmem(gd->fdt_blob)));
185 if (IS_ENABLED(CONFIG_VIDEO))
186 ut_assertok(test_video_info(uts));
188 /* The gd->multi_dtb_fit may not be available, hence, #if below. */
189 #if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
190 ut_assertok(test_num_l(uts, "multi_dtb_fit", (ulong)gd->multi_dtb_fit));
193 if (IS_ENABLED(CONFIG_LMB) && gd->fdt_blob) {
194 ut_assertok(lmb_test_dump_all(uts));
195 if (IS_ENABLED(CONFIG_OF_REAL))
196 ut_assert_nextline("devicetree = %s", fdtdec_get_srcname());
199 if (IS_ENABLED(CONFIG_DM_SERIAL)) {
200 struct serial_device_info info;
202 ut_assertnonnull(gd->cur_serial_dev);
203 ut_assertok(serial_getinfo(gd->cur_serial_dev, &info));
205 ut_assertok(test_num_l(uts, "serial addr", info.addr));
206 ut_assertok(test_num_l(uts, " width", info.reg_width));
207 ut_assertok(test_num_l(uts, " shift", info.reg_shift));
208 ut_assertok(test_num_l(uts, " offset", info.reg_offset));
209 ut_assertok(test_num_l(uts, " clock", info.clock));
212 if (IS_ENABLED(CONFIG_CMD_BDINFO_EXTRA)) {
213 ut_assert_nextlinen("stack ptr");
214 ut_assertok(test_num_ll(uts, "ram_top ptr",
215 (unsigned long long)gd->ram_top));
216 ut_assertok(test_num_l(uts, "malloc base", gd_malloc_start()));
219 if (IS_ENABLED(CONFIG_X86))
220 ut_check_skip_to_linen(uts, " high end =");
225 static int bdinfo_test_full(struct unit_test_state *uts)
227 /* Test BDINFO full print */
228 ut_assertok(run_commandf("bdinfo"));
229 ut_assertok(bdinfo_test_all(uts));
230 ut_assertok(run_commandf("bdinfo -a"));
231 ut_assertok(bdinfo_test_all(uts));
232 ut_assert_console_end();
236 BDINFO_TEST(bdinfo_test_full, UTF_CONSOLE);
238 static int bdinfo_test_help(struct unit_test_state *uts)
240 /* Test BDINFO unknown option help text print */
241 if (!CONFIG_IS_ENABLED(GETOPT)) {
242 ut_asserteq(0, run_commandf("bdinfo -h"));
243 ut_assertok(bdinfo_test_all(uts));
245 ut_asserteq(1, run_commandf("bdinfo -h"));
246 ut_assert_nextlinen("bdinfo: invalid option -- h");
247 ut_assert_nextlinen("bdinfo - print Board Info structure");
248 ut_assert_nextline_empty();
249 ut_assert_nextlinen("Usage:");
250 ut_assert_nextlinen("bdinfo");
252 ut_assert_console_end();
256 BDINFO_TEST(bdinfo_test_help, UTF_CONSOLE);
258 static int bdinfo_test_memory(struct unit_test_state *uts)
260 /* Test BDINFO memory layout only print */
261 ut_assertok(run_commandf("bdinfo -m"));
262 if (!CONFIG_IS_ENABLED(GETOPT))
263 ut_assertok(bdinfo_test_all(uts));
265 ut_assertok(bdinfo_check_mem(uts));
266 ut_assert_console_end();
270 BDINFO_TEST(bdinfo_test_memory, UTF_CONSOLE);
272 static int bdinfo_test_eth(struct unit_test_state *uts)
274 /* Test BDINFO ethernet settings only print */
275 ut_assertok(run_commandf("bdinfo -e"));
276 if (!CONFIG_IS_ENABLED(GETOPT))
277 ut_assertok(bdinfo_test_all(uts));
278 else if (IS_ENABLED(CONFIG_CMD_NET))
279 ut_assertok(test_eth(uts));
280 ut_assert_console_end();
284 BDINFO_TEST(bdinfo_test_eth, UTF_CONSOLE);
286 int do_ut_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
288 struct unit_test *tests = UNIT_TEST_SUITE_START(bdinfo_test);
289 const int n_ents = UNIT_TEST_SUITE_COUNT(bdinfo_test);
291 return cmd_ut_category("bdinfo", "bdinfo_test_", tests, n_ents, argc, argv);