1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 /*
3 * libfdt - Flat Device Tree manipulation
4 * Testcase for fdt_appendprop_addrrange()
5 * Copyright (C) 2018 AKASHI Takahiro, Linaro Limited
6 */
7 #include <stdlib.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdint.h>
11
12 #include <libfdt.h>
13
14 #include "tests.h"
15 #include "testdata.h"
16
main(int argc,char * argv[])17 int main(int argc, char *argv[])
18 {
19 void *fdt, *buf;
20 int offset, xac, xsc, num, i, err;
21 uint64_t addr, size;
22
23 if (argc != 5)
24 CONFIG("Usage: %s <dtb file> <address-cells> <size-cells> <num>\n",
25 argv[0]);
26
27 test_init(argc, argv);
28 fdt = load_blob(argv[1]);
29 xac = strtol(argv[2], NULL, 10);
30 xsc = strtol(argv[3], NULL, 10);
31 num = strtol(argv[4], NULL, 10);
32
33 buf = xmalloc(0x1000);
34 if (!buf)
35 FAIL("Couldn't allocate temporary buffer");
36 err = fdt_open_into(fdt, buf, 0x1000);
37 if (err)
38 FAIL("fdt_open_into(): %s", fdt_strerror(err));
39
40 fdt = buf;
41
42 /* Set up */
43 err = fdt_setprop_cell(fdt, 0, "#address-cells", xac);
44 if (err)
45 FAIL("fdt_setprop_cell(\"#address-cells\"): %s",
46 fdt_strerror(err));
47 err = fdt_setprop_cell(fdt, 0, "#size-cells", xsc);
48 if (err)
49 FAIL("fdt_setprop_cell(\"#size-cells\"): %s",
50 fdt_strerror(err));
51
52 offset = fdt_path_offset(fdt, "/node@1");
53 if (offset < 0)
54 FAIL("Couldn't find path %s", "/node@1");
55
56 addr = TEST_MEMREGION_ADDR;
57 if (xac > 1)
58 addr += TEST_MEMREGION_ADDR_HI;
59 size = TEST_MEMREGION_SIZE;
60 if (xsc > 1)
61 size += TEST_MEMREGION_SIZE_HI;
62
63 /*
64 * Do test
65 */
66 /* 1. repeat append's */
67 for (i = 0; i < num; i++) {
68 err = fdt_appendprop_addrrange(fdt, 0, offset,
69 "prop-memregion", addr, size);
70 if (err)
71 FAIL("Failed to append[%d] \"prop-memregion\": %s",
72 i, fdt_strerror(err));
73
74 check_getprop_addrrange(fdt, 0, offset, "prop-memregion",
75 i + 1);
76
77 addr += size;
78 size += TEST_MEMREGION_SIZE_INC;
79 }
80
81 /* 2. default property name */
82 addr = TEST_MEMREGION_ADDR;
83 if (xac > 1)
84 addr += TEST_MEMREGION_ADDR_HI;
85 size = TEST_MEMREGION_SIZE;
86 if (xsc > 1)
87 size += TEST_MEMREGION_SIZE_HI;
88
89 err = fdt_appendprop_addrrange(fdt, 0, offset, "reg", addr, size);
90 if (err)
91 FAIL("Failed to set \"reg\": %s", fdt_strerror(err));
92 check_getprop_addrrange(fdt, 0, offset, "reg", 1);
93
94 PASS();
95 }
96