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