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