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 phandle format options
5*cd60bc56SAndroid Build Coastguard Worker * Copyright (C) 2009 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
12*cd60bc56SAndroid Build Coastguard Worker #include <libfdt.h>
13*cd60bc56SAndroid Build Coastguard Worker
14*cd60bc56SAndroid Build Coastguard Worker #include "tests.h"
15*cd60bc56SAndroid Build Coastguard Worker #include "testdata.h"
16*cd60bc56SAndroid Build Coastguard Worker
17*cd60bc56SAndroid Build Coastguard Worker #define PHANDLE_LEGACY 0x1
18*cd60bc56SAndroid Build Coastguard Worker #define PHANDLE_EPAPR 0x2
19*cd60bc56SAndroid Build Coastguard Worker #define PHANDLE_BOTH 0x3
20*cd60bc56SAndroid Build Coastguard Worker
main(int argc,char * argv[])21*cd60bc56SAndroid Build Coastguard Worker int main(int argc, char *argv[])
22*cd60bc56SAndroid Build Coastguard Worker {
23*cd60bc56SAndroid Build Coastguard Worker void *fdt;
24*cd60bc56SAndroid Build Coastguard Worker int phandle_format;
25*cd60bc56SAndroid Build Coastguard Worker int n4;
26*cd60bc56SAndroid Build Coastguard Worker uint32_t h4;
27*cd60bc56SAndroid Build Coastguard Worker
28*cd60bc56SAndroid Build Coastguard Worker if (argc != 3)
29*cd60bc56SAndroid Build Coastguard Worker CONFIG("Usage: %s <dtb file> <legacy|epapr|both>\n", argv[0]);
30*cd60bc56SAndroid Build Coastguard Worker
31*cd60bc56SAndroid Build Coastguard Worker test_init(argc, argv);
32*cd60bc56SAndroid Build Coastguard Worker fdt = load_blob(argv[1]);
33*cd60bc56SAndroid Build Coastguard Worker
34*cd60bc56SAndroid Build Coastguard Worker if (streq(argv[2], "legacy"))
35*cd60bc56SAndroid Build Coastguard Worker phandle_format = PHANDLE_LEGACY;
36*cd60bc56SAndroid Build Coastguard Worker else if (streq(argv[2], "epapr"))
37*cd60bc56SAndroid Build Coastguard Worker phandle_format = PHANDLE_EPAPR;
38*cd60bc56SAndroid Build Coastguard Worker else if (streq(argv[2], "both"))
39*cd60bc56SAndroid Build Coastguard Worker phandle_format = PHANDLE_BOTH;
40*cd60bc56SAndroid Build Coastguard Worker else
41*cd60bc56SAndroid Build Coastguard Worker CONFIG("Usage: %s <dtb file> <legacy|epapr|both>\n", argv[0]);
42*cd60bc56SAndroid Build Coastguard Worker
43*cd60bc56SAndroid Build Coastguard Worker n4 = fdt_path_offset(fdt, "/node4");
44*cd60bc56SAndroid Build Coastguard Worker if (n4 < 0)
45*cd60bc56SAndroid Build Coastguard Worker FAIL("fdt_path_offset(/node4): %s", fdt_strerror(n4));
46*cd60bc56SAndroid Build Coastguard Worker
47*cd60bc56SAndroid Build Coastguard Worker h4 = fdt_get_phandle(fdt, n4);
48*cd60bc56SAndroid Build Coastguard Worker if ((h4 == 0) || (h4 == ~0U))
49*cd60bc56SAndroid Build Coastguard Worker FAIL("/node4 has bad phandle 0x%x\n", h4);
50*cd60bc56SAndroid Build Coastguard Worker
51*cd60bc56SAndroid Build Coastguard Worker if (phandle_format & PHANDLE_LEGACY)
52*cd60bc56SAndroid Build Coastguard Worker check_getprop_cell(fdt, n4, "linux,phandle", h4);
53*cd60bc56SAndroid Build Coastguard Worker else
54*cd60bc56SAndroid Build Coastguard Worker if (fdt_getprop(fdt, n4, "linux,phandle", NULL))
55*cd60bc56SAndroid Build Coastguard Worker FAIL("linux,phandle property present in non-legacy mode");
56*cd60bc56SAndroid Build Coastguard Worker
57*cd60bc56SAndroid Build Coastguard Worker if (phandle_format & PHANDLE_EPAPR)
58*cd60bc56SAndroid Build Coastguard Worker check_getprop_cell(fdt, n4, "phandle", h4);
59*cd60bc56SAndroid Build Coastguard Worker else
60*cd60bc56SAndroid Build Coastguard Worker if (fdt_getprop(fdt, n4, "phandle", NULL))
61*cd60bc56SAndroid Build Coastguard Worker FAIL("phandle property present in legacy-only mode");
62*cd60bc56SAndroid Build Coastguard Worker
63*cd60bc56SAndroid Build Coastguard Worker PASS();
64*cd60bc56SAndroid Build Coastguard Worker }
65