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