1*cd60bc56SAndroid Build Coastguard Worker // SPDX-License-Identifier: LGPL-2.1-or-later
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker * libfdt - Flat Device Tree manipulation
4*cd60bc56SAndroid Build Coastguard Worker * Testcase for fdt_node_offset_by_compatible()
5*cd60bc56SAndroid Build Coastguard Worker * Copyright (C) 2006 David Gibson, IBM Corporation.
6*cd60bc56SAndroid Build Coastguard Worker */
7*cd60bc56SAndroid Build Coastguard Worker #include <stdlib.h>
8*cd60bc56SAndroid Build Coastguard Worker #include <stdio.h>
9*cd60bc56SAndroid Build Coastguard Worker #include <string.h>
10*cd60bc56SAndroid Build Coastguard Worker #include <stdint.h>
11*cd60bc56SAndroid Build Coastguard Worker #include <stdarg.h>
12*cd60bc56SAndroid Build Coastguard Worker
13*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
14*cd60bc56SAndroid Build Coastguard Worker
15*cd60bc56SAndroid Build Coastguard Worker #include "tests.h"
16*cd60bc56SAndroid Build Coastguard Worker #include "testdata.h"
17*cd60bc56SAndroid Build Coastguard Worker
check_search(void * fdt,const char * compat,...)18*cd60bc56SAndroid Build Coastguard Worker static void check_search(void *fdt, const char *compat, ...)
19*cd60bc56SAndroid Build Coastguard Worker {
20*cd60bc56SAndroid Build Coastguard Worker va_list ap;
21*cd60bc56SAndroid Build Coastguard Worker int offset = -1, target;
22*cd60bc56SAndroid Build Coastguard Worker
23*cd60bc56SAndroid Build Coastguard Worker va_start(ap, compat);
24*cd60bc56SAndroid Build Coastguard Worker do {
25*cd60bc56SAndroid Build Coastguard Worker target = va_arg(ap, int);
26*cd60bc56SAndroid Build Coastguard Worker verbose_printf("Searching (target = %d): %d ->",
27*cd60bc56SAndroid Build Coastguard Worker target, offset);
28*cd60bc56SAndroid Build Coastguard Worker offset = fdt_node_offset_by_compatible(fdt, offset, compat);
29*cd60bc56SAndroid Build Coastguard Worker verbose_printf("%d\n", offset);
30*cd60bc56SAndroid Build Coastguard Worker
31*cd60bc56SAndroid Build Coastguard Worker if (offset != target)
32*cd60bc56SAndroid Build Coastguard Worker FAIL("fdt_node_offset_by_compatible(%s) returns %d "
33*cd60bc56SAndroid Build Coastguard Worker "instead of %d", compat, offset, target);
34*cd60bc56SAndroid Build Coastguard Worker } while (target >= 0);
35*cd60bc56SAndroid Build Coastguard Worker
36*cd60bc56SAndroid Build Coastguard Worker va_end(ap);
37*cd60bc56SAndroid Build Coastguard Worker }
38*cd60bc56SAndroid Build Coastguard Worker
main(int argc,char * argv[])39*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
40*cd60bc56SAndroid Build Coastguard Worker {
41*cd60bc56SAndroid Build Coastguard Worker void *fdt;
42*cd60bc56SAndroid Build Coastguard Worker int subnode1_offset, subnode2_offset;
43*cd60bc56SAndroid Build Coastguard Worker int subsubnode1_offset, subsubnode2_offset;
44*cd60bc56SAndroid Build Coastguard Worker
45*cd60bc56SAndroid Build Coastguard Worker test_init(argc, argv);
46*cd60bc56SAndroid Build Coastguard Worker fdt = load_blob_arg(argc, argv);
47*cd60bc56SAndroid Build Coastguard Worker
48*cd60bc56SAndroid Build Coastguard Worker subnode1_offset = fdt_path_offset(fdt, "/subnode@1");
49*cd60bc56SAndroid Build Coastguard Worker subnode2_offset = fdt_path_offset(fdt, "/subnode@2");
50*cd60bc56SAndroid Build Coastguard Worker subsubnode1_offset = fdt_path_offset(fdt, "/subnode@1/subsubnode");
51*cd60bc56SAndroid Build Coastguard Worker subsubnode2_offset = fdt_path_offset(fdt, "/subnode@2/subsubnode@0");
52*cd60bc56SAndroid Build Coastguard Worker
53*cd60bc56SAndroid Build Coastguard Worker if ((subnode1_offset < 0) || (subnode2_offset < 0)
54*cd60bc56SAndroid Build Coastguard Worker || (subsubnode1_offset < 0) || (subsubnode2_offset < 0))
55*cd60bc56SAndroid Build Coastguard Worker FAIL("Can't find required nodes");
56*cd60bc56SAndroid Build Coastguard Worker
57*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "test_tree1", 0, -FDT_ERR_NOTFOUND);
58*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "subnode1", subnode1_offset, -FDT_ERR_NOTFOUND);
59*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "subsubnode1", subsubnode1_offset, -FDT_ERR_NOTFOUND);
60*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "subsubnode2", subsubnode2_offset, -FDT_ERR_NOTFOUND);
61*cd60bc56SAndroid Build Coastguard Worker /* Eek.. HACK to make this work whatever the order in the
62*cd60bc56SAndroid Build Coastguard Worker * example tree */
63*cd60bc56SAndroid Build Coastguard Worker if (subsubnode1_offset < subsubnode2_offset)
64*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "subsubnode", subsubnode1_offset,
65*cd60bc56SAndroid Build Coastguard Worker subsubnode2_offset, -FDT_ERR_NOTFOUND);
66*cd60bc56SAndroid Build Coastguard Worker else
67*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "subsubnode", subsubnode2_offset,
68*cd60bc56SAndroid Build Coastguard Worker subsubnode1_offset, -FDT_ERR_NOTFOUND);
69*cd60bc56SAndroid Build Coastguard Worker check_search(fdt, "nothing-like-this", -FDT_ERR_NOTFOUND);
70*cd60bc56SAndroid Build Coastguard Worker
71*cd60bc56SAndroid Build Coastguard Worker PASS();
72*cd60bc56SAndroid Build Coastguard Worker }
73