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