blob: 5d7402154d180e98a8e0c92b8f9feba66435a10f [file] [log] [blame]
Alexander Gendin04291ee2023-10-09 01:24:36 +00001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Tests for mbr command
4 *
5 * Copyright 2023 Matrox Video
6 * Written by Alex Gendin <agendin@matrox.com>
7 */
8
9#include <dm.h>
10#include <console.h>
11#include <dm/test.h>
12#include <mapmem.h>
13#include <part.h>
14#include <asm/global_data.h>
15#include <dm/device-internal.h>
16#include <dm/lists.h>
17#include <test/suites.h>
18#include <test/ut.h>
19
20DECLARE_GLOBAL_DATA_PTR;
21/*
22 * Requirements for running test manually:
23 * mmc6.img - File size needs to be at least 12 MiB
24 *
25 * Command to create mmc6.img:
26 * $ dd if=/dev/zero of=mmc6.img bs=12M count=1
27 *
28 * To run this test manually, place mmc6.img into the same directory as u-boot,
29 * then run:
30 * $ ./u-boot -Tc 'ut mbr'
31 *
32 * To run this test as part of U-Boot test:
33 * $ ./test/py/test.py --bd sandbox --build -k ut_dm -v
34 * Note: mmc6.img will be created by the test suit.
35 */
36
37static char * mbr_parts_header = "setenv mbr_parts '";
38static char * mbr_parts_p1 = "uuid_disk=0x12345678;name=p1,start=8M,bootable,size=1M,id=0x0e";
39static char * mbr_parts_p2 = ";name=p2,size=1M,id=0x0e";
40static char * mbr_parts_p3 = ";name=p3,size=1M,id=0x0e";
41static char * mbr_parts_p4 = ";name=p4,size=1M,id=0x0e";
42static char * mbr_parts_p5 = ";name=[ext],size=2M,id=0x05;name=p5,size=1M,id=0x0e";
43static char * mbr_parts_tail = "'";
44
45/*
46 * One MBR partition
47000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
48000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 00 |...%$..@........|
49000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
50000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
51000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
52*/
53static unsigned mbr_cmp_start = 0x1B8;
54static unsigned mbr_cmp_size = 0x48;
55static unsigned char mbr_parts_ref_p1[] = {
56 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
570x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
580x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
590x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
61};
62
63/*
64 * Two MBR partitions
65000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
66000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
67000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 00 |%..F...H........|
68000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
69000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
70*/
71static unsigned char mbr_parts_ref_p2[] = {
72 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
730x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
740x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
750x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
760x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
77};
78
79/*
80 * Three MBR partitions
81000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
82000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
83000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
84000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 00 |...f%..P........|
85000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
86*/
87static unsigned char mbr_parts_ref_p3[] = {
88 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
890x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
900x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x46,
910x06, 0x01, 0x0e, 0x66, 0x25, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
920x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
93};
94
95/*
96 * Four MBR partitions
97000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
98000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
99000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
100000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
101000001f0 26 01 0e 87 06 01 00 58 00 00 00 08 00 00 55 aa |&......X......U.|
102*/
103static unsigned char mbr_parts_ref_p4[] = {
104 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
1050x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
1060x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x46,
1070x06, 0x01, 0x0e, 0x66, 0x25, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x66,
1080x26, 0x01, 0x0e, 0x87, 0x06, 0x01, 0x00, 0x58, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x55, 0xaa
109};
110
111/*
112 * Five MBR partitions
113000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
114000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
115000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
116000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
117000001f0 26 01 05 a7 26 01 00 58 00 00 00 10 00 00 55 aa |&...&..X......U.|
118*/
119static unsigned char mbr_parts_ref_p5[] = {
120 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x80, 0x05,
1210x05, 0x01, 0x0e, 0x25, 0x24, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x25,
1220x25, 0x01, 0x0e, 0x46, 0x05, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x46,
1230x06, 0x01, 0x0e, 0x66, 0x25, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x66,
1240x26, 0x01, 0x05, 0xa7, 0x26, 0x01, 0x00, 0x58, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x55, 0xaa
125};
126static unsigned ebr_cmp_start = 0x1B8;
127static unsigned ebr_cmp_size = 0x48;
128/*
129 * EBR
13000b001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87 |................|
13100b001c0 07 01 0e a7 26 01 00 08 00 00 00 08 00 00 00 00 |....&...........|
13200b001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
13300b001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
13400b001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
135*/
136static unsigned char ebr_parts_ref_p5[] = {
137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87,
1380x07, 0x01, 0x0e, 0xa7, 0x26, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
1390x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1400x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1410x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
142};
143
144/* Fill write buffers with pseudo-random data */
145static void init_write_buffers(char *mbr_wb, size_t mbr_wb_size,
146 char *ebr_wb, size_t ebr_wb_size, unsigned seed)
147{
148 while (mbr_wb_size--) {
149 *mbr_wb++ = seed;
150 seed *= 43;
151 seed += 17 + mbr_wb_size/4;
152 }
153 while (ebr_wb_size--) {
154 *ebr_wb++ = seed;
155 seed *= 43;
156 seed += 17 + ebr_wb_size/4;
157 }
158}
159
160/* Build string with MBR partition(s) layout */
161static unsigned build_mbr_parts(char *buf, size_t buf_size, unsigned num_parts)
162{
163 size_t bytes_remaining, cur_str_size;
164 char * cur_buf;
165
166 if (!num_parts || num_parts > 5 || !buf)
167 return 1;
168
169 cur_buf = buf;
170 *cur_buf = '\0';
171 bytes_remaining = buf_size;
172
173 cur_str_size = sizeof(mbr_parts_header);
174 if (cur_str_size + 1 > bytes_remaining)
175 return 1;
176 strcat(cur_buf, mbr_parts_header);
177 bytes_remaining -= cur_str_size;
178
179 if (num_parts >= 1) {
180 cur_str_size = sizeof(mbr_parts_p1);
181 if (cur_str_size + 1 > bytes_remaining)
182 return 1;
183 strcat(cur_buf, mbr_parts_p1);
184 bytes_remaining -= cur_str_size;
185
186 if (num_parts >= 2) {
187 cur_str_size = sizeof(mbr_parts_p2);
188 if (cur_str_size + 1 > bytes_remaining)
189 return 1;
190 strcat(cur_buf, mbr_parts_p2);
191 bytes_remaining -= cur_str_size;
192
193 if (num_parts >= 3) {
194 cur_str_size = sizeof(mbr_parts_p3);
195 if (cur_str_size + 1 > bytes_remaining)
196 return 1;
197 strcat(cur_buf, mbr_parts_p3);
198 bytes_remaining -= cur_str_size;
199
200 if (num_parts == 4) {
201 cur_str_size = sizeof(mbr_parts_p4);
202 if (cur_str_size + 1 > bytes_remaining)
203 return 1;
204 strcat(cur_buf, mbr_parts_p4);
205 bytes_remaining -= cur_str_size;
206
207 }
208 else if (num_parts == 5) {
209 cur_str_size = sizeof(mbr_parts_p5);
210 if (cur_str_size + 1 > bytes_remaining)
211 return 1;
212 strcat(cur_buf, mbr_parts_p5);
213 bytes_remaining -= cur_str_size;
214
215 }
216 else if (num_parts > 5)
217 return 1;
218 }
219 }
220 }
221
222 cur_str_size = sizeof(mbr_parts_tail);
223 if (cur_str_size + 1 > bytes_remaining)
224 return 1;
225 strcat(cur_buf, mbr_parts_tail);
226
227 return 0;
228}
229
230static int mbr_test_run(struct unit_test_state *uts)
231{
232 struct blk_desc *mmc_dev_desc;
233 unsigned char mbr_wbuf[512], ebr_wbuf[512], rbuf[512];
234 char mbr_parts_buf[256];
235 ulong mbr_wa, ebr_wa, ra, ebr_blk, mbr_parts_max;
236 struct udevice *dev;
237 ofnode root, node;
238
239 /* Enable the mmc6 node for this test */
240 root = oftree_root(oftree_default());
241 node = ofnode_find_subnode(root, "mmc6");
242 ut_assert(ofnode_valid(node));
243 ut_assertok(lists_bind_fdt(gd->dm_root, node, &dev, NULL, false));
244
245 mbr_parts_max = sizeof('\0') + 2 +
246 strlen(mbr_parts_header) +
247 strlen(mbr_parts_p1) +
248 strlen(mbr_parts_p2) +
249 strlen(mbr_parts_p3) +
250 max(strlen(mbr_parts_p4), strlen(mbr_parts_p5)) +
251 strlen(mbr_parts_tail);
252 ut_assertf(sizeof(mbr_parts_buf) >= mbr_parts_max, "Buffer avail: %ld; buffer req: %ld\n",
253 sizeof(mbr_parts_buf), mbr_parts_max);
254
255 mbr_wa = map_to_sysmem(mbr_wbuf);
256 ebr_wa = map_to_sysmem(ebr_wbuf);
257 ra = map_to_sysmem(rbuf);
258 ebr_blk = (ulong)0xB00000 / 0x200;
259
260 /* Make sure mmc6 exists */
261 ut_asserteq(6, blk_get_device_by_str("mmc", "6", &mmc_dev_desc));
262 ut_assertok(console_record_reset_enable());
263 ut_assertok(run_commandf("mmc dev 6"));
264 ut_assert_nextline("switch to partitions #0, OK");
265 ut_assert_nextline("mmc6 is current device");
266 ut_assertok(ut_check_console_end(uts));
267
268 /* Make sure mmc6 is 12+ MiB in size */
269 ut_assertok(run_commandf("mmc read 0x%lx 0x%lx 1", ra, (ulong)0xBFFE00 / 0x200));
270
271 /* Test one MBR partition */
272 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
273 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 1));
274 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
275 memset(rbuf, 0, sizeof(rbuf));
276 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
277 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
278 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
279 memset(rbuf, 0, sizeof(rbuf));
280 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
281 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
282 ut_assertok(console_record_reset_enable());
283 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
284 ut_assertok(run_commandf("mbr write mmc 6"));
285 ut_assert_nextline("MBR: write success!");
286 ut_assertok(run_commandf("mbr verify mmc 6"));
287 ut_assert_nextline("MBR: verify success!");
288 memset(rbuf, 0, sizeof(rbuf));
289 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
290 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
291 ut_assertok(ut_check_console_end(uts));
292 /*
293 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
294 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 00 |...%$..@........|
295 000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
296 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
297 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
298 */
299 memset(rbuf, 0, sizeof(rbuf));
300 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
301 for (unsigned i = 0; i < mbr_cmp_size; i++) {
302 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p1[i],
303 "1P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
304 mbr_cmp_start + i, mbr_parts_ref_p1[i], rbuf[mbr_cmp_start + i]);
305 }
306
307 /* Test two MBR partitions */
308 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
309 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 2));
310 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
311 memset(rbuf, 0, sizeof(rbuf));
312 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
313 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
314 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
315 memset(rbuf, 0, sizeof(rbuf));
316 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
317 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
318 ut_assertok(console_record_reset_enable());
319 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
320 ut_assertok(run_commandf("mbr write mmc 6"));
321 ut_assert_nextline("MBR: write success!");
322 ut_assertok(run_commandf("mbr verify mmc 6"));
323 ut_assert_nextline("MBR: verify success!");
324 memset(rbuf, 0, sizeof(rbuf));
325 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
326 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
327 ut_assertok(ut_check_console_end(uts));
328 /*
329 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
330 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
331 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 00 |%..F...H........|
332 000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
333 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
334 */
335 memset(rbuf, 0, sizeof(rbuf));
336 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
337 for (unsigned i = 0; i < mbr_cmp_size; i++) {
338 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p2[i],
339 "2P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
340 mbr_cmp_start + i, mbr_parts_ref_p2[i], rbuf[mbr_cmp_start + i]);
341 }
342
343 /* Test three MBR partitions */
344 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
345 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 3));
346 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
347 memset(rbuf, 0, sizeof(rbuf));
348 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
349 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
350 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
351 memset(rbuf, 0, sizeof(rbuf));
352 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
353 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
354 ut_assertok(console_record_reset_enable());
355 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
356 ut_assertok(run_commandf("mbr write mmc 6"));
357 ut_assert_nextline("MBR: write success!");
358 ut_assertok(run_commandf("mbr verify mmc 6"));
359 ut_assert_nextline("MBR: verify success!");
360 memset(rbuf, 0, sizeof(rbuf));
361 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
362 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
363 ut_assertok(ut_check_console_end(uts));
364 /*
365 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
366 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
367 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
368 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 00 |...f%..P........|
369 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
370 */
371 memset(rbuf, 0, sizeof(rbuf));
372 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
373 for (unsigned i = 0; i < mbr_cmp_size; i++) {
374 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p3[i],
375 "3P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
376 mbr_cmp_start + i, mbr_parts_ref_p3[i], rbuf[mbr_cmp_start + i]);
377 }
378
379 /* Test four MBR partitions */
380 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
381 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 4));
382 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
383 memset(rbuf, 0, sizeof(rbuf));
384 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
385 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
386 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
387 memset(rbuf, 0, sizeof(rbuf));
388 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
389 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
390 ut_assertok(console_record_reset_enable());
391 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
392 ut_assertok(run_commandf("mbr write mmc 6"));
393 ut_assert_nextline("MBR: write success!");
394 ut_assertok(run_commandf("mbr verify mmc 6"));
395 ut_assert_nextline("MBR: verify success!");
396 memset(rbuf, 0, sizeof(rbuf));
397 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
398 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
399 ut_assertok(ut_check_console_end(uts));
400 /*
401 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
402 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
403 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
404 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
405 000001f0 26 01 0e 87 06 01 00 58 00 00 00 08 00 00 55 aa |&......X......U.|
406 */
407 memset(rbuf, 0, sizeof(rbuf));
408 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
409 for (unsigned i = 0; i < mbr_cmp_size; i++) {
410 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p4[i],
411 "4P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
412 mbr_cmp_start + i, mbr_parts_ref_p4[i], rbuf[mbr_cmp_start + i]);
413 }
414
415 /* Test five MBR partitions */
416 init_write_buffers(mbr_wbuf, sizeof(mbr_wbuf), ebr_wbuf, sizeof(ebr_wbuf), __LINE__);
417 ut_assertok(build_mbr_parts(mbr_parts_buf, sizeof(mbr_parts_buf), 5));
418 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0 1", mbr_wa));
419 memset(rbuf, 0, sizeof(rbuf));
420 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
421 ut_assertok(memcmp(mbr_wbuf, rbuf, 512));
422 ut_assertok(run_commandf("write mmc 6:0 0x%lx 0x%lx 1", ebr_wa, ebr_blk));
423 memset(rbuf, 0, sizeof(rbuf));
424 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
425 ut_assertok(memcmp(ebr_wbuf, rbuf, 512));
426 ut_assertok(console_record_reset_enable());
427 ut_assertf(0 == run_commandf(mbr_parts_buf), "Invalid partitions string: %s\n", mbr_parts_buf);
428 ut_assertf(0 == run_commandf("mbr write mmc 6"), "Invalid partitions string: %s\n", mbr_parts_buf);
429 ut_assert_nextline("MBR: write success!");
430 ut_assertok(run_commandf("mbr verify mmc 6"));
431 ut_assert_nextline("MBR: verify success!");
432 ut_assertok(ut_check_console_end(uts));
433 /*
434 000001b0 00 00 00 00 00 00 00 00 78 56 34 12 00 00 80 05 |........xV4.....|
435 000001c0 05 01 0e 25 24 01 00 40 00 00 00 08 00 00 00 25 |...%$..@.......%|
436 000001d0 25 01 0e 46 05 01 00 48 00 00 00 08 00 00 00 46 |%..F...H.......F|
437 000001e0 06 01 0e 66 25 01 00 50 00 00 00 08 00 00 00 66 |...f%..P.......f|
438 000001f0 26 01 05 a7 26 01 00 58 00 00 00 10 00 00 55 aa |&...&..X......U.|
439 */
440 memset(rbuf, 0, sizeof(rbuf));
441 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0 1", ra));
442 for (unsigned i = 0; i < mbr_cmp_size; i++) {
443 ut_assertf(rbuf[mbr_cmp_start + i] == mbr_parts_ref_p5[i],
444 "5P MBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
445 mbr_cmp_start + i, mbr_parts_ref_p5[i], rbuf[mbr_cmp_start + i]);
446 }
447 /*
448 00b001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 87 |................|
449 00b001c0 07 01 0e a7 26 01 00 08 00 00 00 08 00 00 00 00 |....&...........|
450 00b001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
451 00b001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
452 00b001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
453 */
454 memset(rbuf, 0, sizeof(rbuf));
455 ut_assertok(run_commandf("read mmc 6:0 0x%lx 0x%lx 1", ra, ebr_blk));
456 for (unsigned i = 0; i < ebr_cmp_size; i++) {
457 ut_assertf(rbuf[ebr_cmp_start + i] == ebr_parts_ref_p5[i],
458 "5P EBR+0x%04X: expected 0x%02X, actual: 0x%02X\n",
459 ebr_cmp_start + i, ebr_parts_ref_p5[i], rbuf[ebr_cmp_start + i]);
460 }
461
462 return 0;
463}
464
465/* Declare mbr test */
466UNIT_TEST(mbr_test_run, UT_TESTF_CONSOLE_REC, mbr_test);
467
468int do_ut_mbr(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
469{
470 struct unit_test *tests = UNIT_TEST_SUITE_START(mbr_test);
471 const int n_ents = UNIT_TEST_SUITE_COUNT(mbr_test);
472
473 return cmd_ut_category("mbr", "mbr_test_", tests, n_ents, argc, argv);
474}
475
476static int dm_test_cmd_mbr(struct unit_test_state *uts)
477{
478 return mbr_test_run(uts);
479}
480
481DM_TEST(dm_test_cmd_mbr, UT_TESTF_SCAN_FDT | UT_TESTF_CONSOLE_REC);