blob: 09f44ee41eda1623952119dbf913705be8ff5577 [file] [log] [blame]
Marek Vasut2cd173c2023-05-31 03:03:58 +02001// 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
Sughosh Ganu291bf9c2024-08-26 17:29:18 +05308#include <alist.h>
Marek Vasut2cd173c2023-05-31 03:03:58 +02009#include <console.h>
10#include <mapmem.h>
11#include <asm/global_data.h>
12#include <dm/uclass.h>
Marek Vasut2cd173c2023-05-31 03:03:58 +020013#include <test/ut.h>
14#include <dm.h>
15#include <env.h>
16#include <lmb.h>
17#include <net.h>
Simon Glass3ddee312023-07-12 09:04:37 -060018#include <serial.h>
Marek Vasut2cd173c2023-05-31 03:03:58 +020019#include <video.h>
20#include <vsprintf.h>
21#include <asm/cache.h>
22#include <asm/global_data.h>
23#include <display_options.h>
24
25DECLARE_GLOBAL_DATA_PTR;
26
27/* Declare a new bdinfo test */
Simon Glassb15512c2025-01-20 14:25:32 -070028#define BDINFO_TEST(_name, _flags) UNIT_TEST(_name, _flags, bdinfo)
Marek Vasut2cd173c2023-05-31 03:03:58 +020029
Simon Glass0a5e0692023-07-11 20:46:30 -060030static int test_num_l(struct unit_test_state *uts, const char *name,
31 ulong value)
Marek Vasut2cd173c2023-05-31 03:03:58 +020032{
Simon Glass0a5e0692023-07-11 20:46:30 -060033 ut_assert_nextline("%-12s= 0x%0*lx", name, 2 * (int)sizeof(value),
34 value);
35
36 return 0;
Marek Vasut2cd173c2023-05-31 03:03:58 +020037}
38
Simon Glass0a5e0692023-07-11 20:46:30 -060039static int test_num_ll(struct unit_test_state *uts, const char *name,
40 unsigned long long value)
Marek Vasut2cd173c2023-05-31 03:03:58 +020041{
Simon Glass0a5e0692023-07-11 20:46:30 -060042 ut_assert_nextline("%-12s= 0x%.*llx", name, 2 * (int)sizeof(ulong),
43 value);
44
45 return 0;
Marek Vasut2cd173c2023-05-31 03:03:58 +020046}
47
Simon Glass0a5e0692023-07-11 20:46:30 -060048static int test_eth(struct unit_test_state *uts)
Marek Vasut2cd173c2023-05-31 03:03:58 +020049{
50 const int idx = eth_get_dev_index();
51 uchar enetaddr[6];
52 char name[10];
53 int ret;
54
55 if (idx)
56 sprintf(name, "eth%iaddr", idx);
57 else
58 strcpy(name, "ethaddr");
59
60 ret = eth_env_get_enetaddr_by_index("eth", idx, enetaddr);
61
62 ut_assert_nextline("current eth = %s", eth_get_name());
63 if (!ret)
64 ut_assert_nextline("%-12s= (not set)", name);
65 else
66 ut_assert_nextline("%-12s= %pM", name, enetaddr);
67 ut_assert_nextline("IP addr = %s", env_get("ipaddr"));
Simon Glass0a5e0692023-07-11 20:46:30 -060068
69 return 0;
Marek Vasut2cd173c2023-05-31 03:03:58 +020070}
71
Simon Glass0a5e0692023-07-11 20:46:30 -060072static int test_video_info(struct unit_test_state *uts)
Marek Vasut2cd173c2023-05-31 03:03:58 +020073{
74 const struct udevice *dev;
75 struct uclass *uc;
76
77 uclass_id_foreach_dev(UCLASS_VIDEO, dev, uc) {
78 ut_assert_nextline("%-12s= %s %sactive", "Video", dev->name,
79 device_active(dev) ? "" : "in");
80 if (device_active(dev)) {
81 struct video_priv *upriv = dev_get_uclass_priv(dev);
82 struct video_uc_plat *plat = dev_get_uclass_plat(dev);
83
Simon Glass0a5e0692023-07-11 20:46:30 -060084 ut_assertok(test_num_ll(uts, "FB base",
85 (ulong)upriv->fb));
Marek Vasut2cd173c2023-05-31 03:03:58 +020086 if (upriv->copy_fb) {
Simon Glass0a5e0692023-07-11 20:46:30 -060087 ut_assertok(test_num_ll(uts, "FB copy",
88 (ulong)upriv->copy_fb));
89 ut_assertok(test_num_l(uts, " copy size",
90 plat->copy_size));
Marek Vasut2cd173c2023-05-31 03:03:58 +020091 }
92 ut_assert_nextline("%-12s= %dx%dx%d", "FB size",
93 upriv->xsize, upriv->ysize,
94 1 << upriv->bpix);
95 }
96 }
Simon Glass0a5e0692023-07-11 20:46:30 -060097
98 return 0;
Marek Vasut2cd173c2023-05-31 03:03:58 +020099}
100
Simon Glass0a5e0692023-07-11 20:46:30 -0600101static int lmb_test_dump_region(struct unit_test_state *uts,
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530102 struct alist *lmb_rgn_lst, char *name)
Marek Vasut2cd173c2023-05-31 03:03:58 +0200103{
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530104 struct lmb_region *rgn = lmb_rgn_lst->data;
Marek Vasut2cd173c2023-05-31 03:03:58 +0200105 unsigned long long base, size, end;
Ilias Apalodimasd8462bf2024-12-18 09:02:31 +0200106 u32 flags;
Marek Vasut2cd173c2023-05-31 03:03:58 +0200107 int i;
108
Heinrich Schuchardt2abe3052024-11-07 11:14:42 +0100109 ut_assert_nextline(" %s.count = %#x", name, lmb_rgn_lst->count);
Marek Vasut2cd173c2023-05-31 03:03:58 +0200110
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530111 for (i = 0; i < lmb_rgn_lst->count; i++) {
112 base = rgn[i].base;
113 size = rgn[i].size;
Marek Vasut2cd173c2023-05-31 03:03:58 +0200114 end = base + size - 1;
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530115 flags = rgn[i].flags;
Marek Vasut2cd173c2023-05-31 03:03:58 +0200116
Simon Glassa44bd852023-10-01 19:15:16 -0600117 if (!IS_ENABLED(CONFIG_SANDBOX) && i == 3) {
118 ut_assert_nextlinen(" %s[%d]\t[", name, i);
119 continue;
120 }
Heinrich Schuchardt2abe3052024-11-07 11:14:42 +0100121 ut_assert_nextlinen(" %s[%d]\t[%#llx-%#llx], %#llx bytes, flags: ",
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530122 name, i, base, end, size);
Marek Vasut2cd173c2023-05-31 03:03:58 +0200123 }
Simon Glass0a5e0692023-07-11 20:46:30 -0600124
125 return 0;
Marek Vasut2cd173c2023-05-31 03:03:58 +0200126}
127
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530128static int lmb_test_dump_all(struct unit_test_state *uts)
Marek Vasut2cd173c2023-05-31 03:03:58 +0200129{
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530130 struct lmb *lmb = lmb_get();
131
Marek Vasut2cd173c2023-05-31 03:03:58 +0200132 ut_assert_nextline("lmb_dump_all:");
Ilias Apalodimas5421c332024-12-18 09:02:33 +0200133 ut_assertok(lmb_test_dump_region(uts, &lmb->available_mem, "memory"));
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530134 ut_assertok(lmb_test_dump_region(uts, &lmb->used_mem, "reserved"));
Simon Glass0a5e0692023-07-11 20:46:30 -0600135
136 return 0;
Marek Vasut2cd173c2023-05-31 03:03:58 +0200137}
138
Marek Vasut3c5fd092023-10-07 23:41:05 +0200139static int bdinfo_check_mem(struct unit_test_state *uts)
Marek Vasut2cd173c2023-05-31 03:03:58 +0200140{
141 struct bd_info *bd = gd->bd;
142 int i;
143
Marek Vasut2cd173c2023-05-31 03:03:58 +0200144 for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
145 if (bd->bi_dram[i].size) {
Simon Glass0a5e0692023-07-11 20:46:30 -0600146 ut_assertok(test_num_l(uts, "DRAM bank", i));
147 ut_assertok(test_num_ll(uts, "-> start",
148 bd->bi_dram[i].start));
149 ut_assertok(test_num_ll(uts, "-> size",
150 bd->bi_dram[i].size));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200151 }
152 }
153
Marek Vasut3c5fd092023-10-07 23:41:05 +0200154 return 0;
155}
156
157static int bdinfo_test_all(struct unit_test_state *uts)
158{
159 ut_assertok(test_num_l(uts, "boot_params", 0));
160
161 ut_assertok(bdinfo_check_mem(uts));
162
Marek Vasut2cd173c2023-05-31 03:03:58 +0200163 /* CONFIG_SYS_HAS_SRAM testing not supported */
Simon Glass0a5e0692023-07-11 20:46:30 -0600164 ut_assertok(test_num_l(uts, "flashstart", 0));
165 ut_assertok(test_num_l(uts, "flashsize", 0));
166 ut_assertok(test_num_l(uts, "flashoffset", 0));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200167 ut_assert_nextline("baudrate = %lu bps",
168 env_get_ulong("baudrate", 10, 1234));
Simon Glass0a5e0692023-07-11 20:46:30 -0600169 ut_assertok(test_num_l(uts, "relocaddr", gd->relocaddr));
170 ut_assertok(test_num_l(uts, "reloc off", gd->reloc_off));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200171 ut_assert_nextline("%-12s= %u-bit", "Build", (uint)sizeof(void *) * 8);
172
173 if (IS_ENABLED(CONFIG_CMD_NET))
Simon Glass0a5e0692023-07-11 20:46:30 -0600174 ut_assertok(test_eth(uts));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200175
176 /*
177 * Make sure environment variable "fdtcontroladdr" address
178 * matches mapped control DT address.
179 */
180 ut_assert(map_to_sysmem(gd->fdt_blob) == env_get_hex("fdtcontroladdr", 0x1234));
Simon Glass0a5e0692023-07-11 20:46:30 -0600181 ut_assertok(test_num_l(uts, "fdt_blob",
182 (ulong)map_to_sysmem(gd->fdt_blob)));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200183
184 if (IS_ENABLED(CONFIG_VIDEO))
Simon Glass43b9a322023-10-01 19:15:17 -0600185 ut_assertok(test_video_info(uts));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200186
187 /* The gd->multi_dtb_fit may not be available, hence, #if below. */
188#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
Simon Glass0a5e0692023-07-11 20:46:30 -0600189 ut_assertok(test_num_l(uts, "multi_dtb_fit", (ulong)gd->multi_dtb_fit));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200190#endif
191
192 if (IS_ENABLED(CONFIG_LMB) && gd->fdt_blob) {
Sughosh Ganu291bf9c2024-08-26 17:29:18 +0530193 ut_assertok(lmb_test_dump_all(uts));
Marek Vasut2cd173c2023-05-31 03:03:58 +0200194 if (IS_ENABLED(CONFIG_OF_REAL))
195 ut_assert_nextline("devicetree = %s", fdtdec_get_srcname());
196 }
197
Simon Glass3ddee312023-07-12 09:04:37 -0600198 if (IS_ENABLED(CONFIG_DM_SERIAL)) {
199 struct serial_device_info info;
200
201 ut_assertnonnull(gd->cur_serial_dev);
202 ut_assertok(serial_getinfo(gd->cur_serial_dev, &info));
203
204 ut_assertok(test_num_l(uts, "serial addr", info.addr));
205 ut_assertok(test_num_l(uts, " width", info.reg_width));
206 ut_assertok(test_num_l(uts, " shift", info.reg_shift));
207 ut_assertok(test_num_l(uts, " offset", info.reg_offset));
208 ut_assertok(test_num_l(uts, " clock", info.clock));
209 }
210
Simon Glass5087c772023-07-15 21:38:46 -0600211 if (IS_ENABLED(CONFIG_CMD_BDINFO_EXTRA)) {
212 ut_assert_nextlinen("stack ptr");
213 ut_assertok(test_num_ll(uts, "ram_top ptr",
214 (unsigned long long)gd->ram_top));
215 ut_assertok(test_num_l(uts, "malloc base", gd_malloc_start()));
216 }
217
Simon Glass43b9a322023-10-01 19:15:17 -0600218 if (IS_ENABLED(CONFIG_X86))
219 ut_check_skip_to_linen(uts, " high end =");
220
Marek Vasuteb0b1db2023-10-07 23:41:03 +0200221 return 0;
222}
223
224static int bdinfo_test_full(struct unit_test_state *uts)
225{
226 /* Test BDINFO full print */
Marek Vasuteb0b1db2023-10-07 23:41:03 +0200227 ut_assertok(run_commandf("bdinfo"));
228 ut_assertok(bdinfo_test_all(uts));
229 ut_assertok(run_commandf("bdinfo -a"));
230 ut_assertok(bdinfo_test_all(uts));
Simon Glassc579bd42024-08-22 07:58:03 -0600231 ut_assert_console_end();
Marek Vasut2cd173c2023-05-31 03:03:58 +0200232
233 return 0;
234}
Simon Glass11fcfa32024-08-22 07:57:50 -0600235BDINFO_TEST(bdinfo_test_full, UTF_CONSOLE);
Marek Vasut2cd173c2023-05-31 03:03:58 +0200236
Marek Vasut24099242023-10-07 23:41:04 +0200237static int bdinfo_test_help(struct unit_test_state *uts)
238{
239 /* Test BDINFO unknown option help text print */
Marek Vasut949f0fe2023-12-10 16:01:56 +0100240 if (!CONFIG_IS_ENABLED(GETOPT)) {
241 ut_asserteq(0, run_commandf("bdinfo -h"));
242 ut_assertok(bdinfo_test_all(uts));
243 } else {
244 ut_asserteq(1, run_commandf("bdinfo -h"));
245 ut_assert_nextlinen("bdinfo: invalid option -- h");
246 ut_assert_nextlinen("bdinfo - print Board Info structure");
247 ut_assert_nextline_empty();
248 ut_assert_nextlinen("Usage:");
249 ut_assert_nextlinen("bdinfo");
250 }
Simon Glassc579bd42024-08-22 07:58:03 -0600251 ut_assert_console_end();
Marek Vasut24099242023-10-07 23:41:04 +0200252
253 return 0;
254}
Simon Glass11fcfa32024-08-22 07:57:50 -0600255BDINFO_TEST(bdinfo_test_help, UTF_CONSOLE);
Marek Vasut24099242023-10-07 23:41:04 +0200256
Marek Vasut3c5fd092023-10-07 23:41:05 +0200257static int bdinfo_test_memory(struct unit_test_state *uts)
258{
259 /* Test BDINFO memory layout only print */
Marek Vasut3c5fd092023-10-07 23:41:05 +0200260 ut_assertok(run_commandf("bdinfo -m"));
Marek Vasut949f0fe2023-12-10 16:01:56 +0100261 if (!CONFIG_IS_ENABLED(GETOPT))
262 ut_assertok(bdinfo_test_all(uts));
263 else
264 ut_assertok(bdinfo_check_mem(uts));
Simon Glassc579bd42024-08-22 07:58:03 -0600265 ut_assert_console_end();
Marek Vasut3c5fd092023-10-07 23:41:05 +0200266
267 return 0;
268}
Simon Glass11fcfa32024-08-22 07:57:50 -0600269BDINFO_TEST(bdinfo_test_memory, UTF_CONSOLE);
Marek Vasut3c5fd092023-10-07 23:41:05 +0200270
Marek Vasutf14a03b2023-10-07 23:41:06 +0200271static int bdinfo_test_eth(struct unit_test_state *uts)
272{
273 /* Test BDINFO ethernet settings only print */
Marek Vasutf14a03b2023-10-07 23:41:06 +0200274 ut_assertok(run_commandf("bdinfo -e"));
Marek Vasut949f0fe2023-12-10 16:01:56 +0100275 if (!CONFIG_IS_ENABLED(GETOPT))
276 ut_assertok(bdinfo_test_all(uts));
277 else if (IS_ENABLED(CONFIG_CMD_NET))
Marek Vasutf14a03b2023-10-07 23:41:06 +0200278 ut_assertok(test_eth(uts));
Simon Glassc579bd42024-08-22 07:58:03 -0600279 ut_assert_console_end();
Marek Vasutf14a03b2023-10-07 23:41:06 +0200280
281 return 0;
282}
Simon Glass11fcfa32024-08-22 07:57:50 -0600283BDINFO_TEST(bdinfo_test_eth, UTF_CONSOLE);