xref: /rk3399_rockchip-uboot/test/dm/test-main.c (revision 2e7d35d2a60339cfa54e26a07326bc75e1060bb3)
1*2e7d35d2SSimon Glass /*
2*2e7d35d2SSimon Glass  * Copyright (c) 2013 Google, Inc
3*2e7d35d2SSimon Glass  *
4*2e7d35d2SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
5*2e7d35d2SSimon Glass  */
6*2e7d35d2SSimon Glass 
7*2e7d35d2SSimon Glass #include <common.h>
8*2e7d35d2SSimon Glass #include <dm.h>
9*2e7d35d2SSimon Glass #include <errno.h>
10*2e7d35d2SSimon Glass #include <dm/test.h>
11*2e7d35d2SSimon Glass #include <dm/root.h>
12*2e7d35d2SSimon Glass #include <dm/uclass-internal.h>
13*2e7d35d2SSimon Glass #include <dm/ut.h>
14*2e7d35d2SSimon Glass 
15*2e7d35d2SSimon Glass DECLARE_GLOBAL_DATA_PTR;
16*2e7d35d2SSimon Glass 
17*2e7d35d2SSimon Glass struct dm_test_state global_test_state;
18*2e7d35d2SSimon Glass 
19*2e7d35d2SSimon Glass /* Get ready for testing */
20*2e7d35d2SSimon Glass static int dm_test_init(struct dm_test_state *dms)
21*2e7d35d2SSimon Glass {
22*2e7d35d2SSimon Glass 	memset(dms, '\0', sizeof(*dms));
23*2e7d35d2SSimon Glass 	gd->dm_root = NULL;
24*2e7d35d2SSimon Glass 	memset(dm_testdrv_op_count, '\0', sizeof(dm_testdrv_op_count));
25*2e7d35d2SSimon Glass 
26*2e7d35d2SSimon Glass 	ut_assertok(dm_init());
27*2e7d35d2SSimon Glass 	dms->root = dm_root();
28*2e7d35d2SSimon Glass 
29*2e7d35d2SSimon Glass 	return 0;
30*2e7d35d2SSimon Glass }
31*2e7d35d2SSimon Glass 
32*2e7d35d2SSimon Glass /* Ensure all the test devices are probed */
33*2e7d35d2SSimon Glass static int do_autoprobe(struct dm_test_state *dms)
34*2e7d35d2SSimon Glass {
35*2e7d35d2SSimon Glass 	struct device *dev;
36*2e7d35d2SSimon Glass 	int ret;
37*2e7d35d2SSimon Glass 
38*2e7d35d2SSimon Glass 	/* Scanning the uclass is enough to probe all the devices */
39*2e7d35d2SSimon Glass 	for (ret = uclass_first_device(UCLASS_TEST, &dev);
40*2e7d35d2SSimon Glass 	     dev;
41*2e7d35d2SSimon Glass 	     ret = uclass_next_device(&dev))
42*2e7d35d2SSimon Glass 		;
43*2e7d35d2SSimon Glass 
44*2e7d35d2SSimon Glass 	return ret;
45*2e7d35d2SSimon Glass }
46*2e7d35d2SSimon Glass 
47*2e7d35d2SSimon Glass static int dm_test_destroy(struct dm_test_state *dms)
48*2e7d35d2SSimon Glass {
49*2e7d35d2SSimon Glass 	int id;
50*2e7d35d2SSimon Glass 
51*2e7d35d2SSimon Glass 	for (id = 0; id < UCLASS_COUNT; id++) {
52*2e7d35d2SSimon Glass 		struct uclass *uc;
53*2e7d35d2SSimon Glass 
54*2e7d35d2SSimon Glass 		/*
55*2e7d35d2SSimon Glass 		 * If the uclass doesn't exist we don't want to create it. So
56*2e7d35d2SSimon Glass 		 * check that here before we call uclass_find_device()/
57*2e7d35d2SSimon Glass 		 */
58*2e7d35d2SSimon Glass 		uc = uclass_find(id);
59*2e7d35d2SSimon Glass 		if (!uc)
60*2e7d35d2SSimon Glass 			continue;
61*2e7d35d2SSimon Glass 		ut_assertok(uclass_destroy(uc));
62*2e7d35d2SSimon Glass 	}
63*2e7d35d2SSimon Glass 
64*2e7d35d2SSimon Glass 	return 0;
65*2e7d35d2SSimon Glass }
66*2e7d35d2SSimon Glass 
67*2e7d35d2SSimon Glass int dm_test_main(void)
68*2e7d35d2SSimon Glass {
69*2e7d35d2SSimon Glass 	struct dm_test *tests = ll_entry_start(struct dm_test, dm_test);
70*2e7d35d2SSimon Glass 	const int n_ents = ll_entry_count(struct dm_test, dm_test);
71*2e7d35d2SSimon Glass 	struct dm_test_state *dms = &global_test_state;
72*2e7d35d2SSimon Glass 	struct dm_test *test;
73*2e7d35d2SSimon Glass 
74*2e7d35d2SSimon Glass 	/*
75*2e7d35d2SSimon Glass 	 * If we have no device tree, or it only has a root node, then these
76*2e7d35d2SSimon Glass 	 * tests clearly aren't going to work...
77*2e7d35d2SSimon Glass 	 */
78*2e7d35d2SSimon Glass 	if (!gd->fdt_blob || fdt_next_node(gd->fdt_blob, 0, NULL) < 0) {
79*2e7d35d2SSimon Glass 		puts("Please run with test device tree:\n"
80*2e7d35d2SSimon Glass 		     "     dtc -I dts -O dtb test/dm/test.dts  -o test/dm/test.dtb\n"
81*2e7d35d2SSimon Glass 		     "    ./u-boot -d test/dm/test.dtb\n");
82*2e7d35d2SSimon Glass 		ut_assert(gd->fdt_blob);
83*2e7d35d2SSimon Glass 	}
84*2e7d35d2SSimon Glass 
85*2e7d35d2SSimon Glass 	printf("Running %d driver model tests\n", n_ents);
86*2e7d35d2SSimon Glass 
87*2e7d35d2SSimon Glass 	for (test = tests; test < tests + n_ents; test++) {
88*2e7d35d2SSimon Glass 		printf("Test: %s\n", test->name);
89*2e7d35d2SSimon Glass 		ut_assertok(dm_test_init(dms));
90*2e7d35d2SSimon Glass 
91*2e7d35d2SSimon Glass 		if (test->flags & DM_TESTF_SCAN_PDATA)
92*2e7d35d2SSimon Glass 			ut_assertok(dm_scan_platdata());
93*2e7d35d2SSimon Glass 		if (test->flags & DM_TESTF_PROBE_TEST)
94*2e7d35d2SSimon Glass 			ut_assertok(do_autoprobe(dms));
95*2e7d35d2SSimon Glass 		if (test->flags & DM_TESTF_SCAN_FDT)
96*2e7d35d2SSimon Glass 			ut_assertok(dm_scan_fdt(gd->fdt_blob));
97*2e7d35d2SSimon Glass 
98*2e7d35d2SSimon Glass 		if (test->func(dms))
99*2e7d35d2SSimon Glass 			break;
100*2e7d35d2SSimon Glass 
101*2e7d35d2SSimon Glass 		ut_assertok(dm_test_destroy(dms));
102*2e7d35d2SSimon Glass 	}
103*2e7d35d2SSimon Glass 
104*2e7d35d2SSimon Glass 	printf("Failures: %d\n", dms->fail_count);
105*2e7d35d2SSimon Glass 
106*2e7d35d2SSimon Glass 	return 0;
107*2e7d35d2SSimon Glass }
108