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