xref: /netbsd-src/external/gpl2/dtc/dist/tests/get_phandle.c (revision cc7d2833ecf67da5a5ddc470841931eb9f6723e4)
1 /*	$NetBSD: get_phandle.c,v 1.1.1.3 2019/12/22 12:34:06 skrll Exp $	*/
2 
3 // SPDX-License-Identifier: LGPL-2.1-or-later
4 /*
5  * libfdt - Flat Device Tree manipulation
6  *	Testcase for fdt_get_phandle()
7  * Copyright (C) 2006 David Gibson, IBM Corporation.
8  */
9 #include <stdbool.h>
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <stdint.h>
14 
15 #include <libfdt.h>
16 
17 #include "tests.h"
18 #include "testdata.h"
19 
check_phandle(void * fdt,const char * path,uint32_t checkhandle)20 static void check_phandle(void *fdt, const char *path, uint32_t checkhandle)
21 {
22 	int offset;
23 	uint32_t phandle;
24 
25 	offset = fdt_path_offset(fdt, path);
26 	if (offset < 0)
27 		FAIL("Couldn't find %s", path);
28 
29 	phandle = fdt_get_phandle(fdt, offset);
30 	if (phandle != checkhandle)
31 		FAIL("fdt_get_phandle(%s) returned 0x%x instead of 0x%x\n",
32 		     path, phandle, checkhandle);
33 }
34 
check_phandle_unique(const void * fdt,uint32_t checkhandle)35 static void check_phandle_unique(const void *fdt, uint32_t checkhandle)
36 {
37 	uint32_t phandle;
38 	int offset = -1;
39 
40 	while (true) {
41 		offset = fdt_next_node(fdt, offset, NULL);
42 		if (offset < 0) {
43 			if (offset == -FDT_ERR_NOTFOUND)
44 				break;
45 
46 			FAIL("error looking for phandle %#x", checkhandle);
47 		}
48 
49 		phandle = fdt_get_phandle(fdt, offset);
50 
51 		if (phandle == checkhandle)
52 			FAIL("generated phandle already exists");
53 	}
54 }
55 
main(int argc,char * argv[])56 int main(int argc, char *argv[])
57 {
58 	uint32_t max, phandle;
59 	void *fdt;
60 	int err;
61 
62 	test_init(argc, argv);
63 	fdt = load_blob_arg(argc, argv);
64 
65 	check_phandle(fdt, "/", 0);
66 	check_phandle(fdt, "/subnode@2", PHANDLE_1);
67 	check_phandle(fdt, "/subnode@2/subsubnode@0", PHANDLE_2);
68 
69 	err = fdt_find_max_phandle(fdt, &max);
70 	if (err < 0)
71 		FAIL("fdt_find_max_phandle returned %d instead of 0\n", err);
72 
73 	if (max != PHANDLE_2)
74 		FAIL("fdt_find_max_phandle found 0x%x instead of 0x%x", max,
75 		     PHANDLE_2);
76 
77 	max = fdt_get_max_phandle(fdt);
78 	if (max != PHANDLE_2)
79 		FAIL("fdt_get_max_phandle returned 0x%x instead of 0x%x\n",
80 		     max, PHANDLE_2);
81 
82 	err = fdt_generate_phandle(fdt, &phandle);
83 	if (err < 0)
84 		FAIL("failed to generate phandle: %d", err);
85 
86 	check_phandle_unique(fdt, phandle);
87 
88 	PASS();
89 }
90