xref: /netbsd-src/external/gpl2/dtc/dist/tests/appendprop_addrrange.c (revision cc7d2833ecf67da5a5ddc470841931eb9f6723e4)
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