12e7d35d2SSimon Glass /* 22e7d35d2SSimon Glass * Copyright (c) 2013 Google, Inc 32e7d35d2SSimon Glass * 42e7d35d2SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 52e7d35d2SSimon Glass */ 62e7d35d2SSimon Glass 72e7d35d2SSimon Glass #include <common.h> 82e7d35d2SSimon Glass #include <dm.h> 92e7d35d2SSimon Glass #include <errno.h> 102e7d35d2SSimon Glass #include <dm/test.h> 112e7d35d2SSimon Glass #include <dm/root.h> 122e7d35d2SSimon Glass #include <dm/uclass-internal.h> 132e7d35d2SSimon Glass #include <dm/ut.h> 142e7d35d2SSimon Glass 152e7d35d2SSimon Glass DECLARE_GLOBAL_DATA_PTR; 162e7d35d2SSimon Glass 172e7d35d2SSimon Glass struct dm_test_state global_test_state; 182e7d35d2SSimon Glass 192e7d35d2SSimon Glass /* Get ready for testing */ 202e7d35d2SSimon Glass static int dm_test_init(struct dm_test_state *dms) 212e7d35d2SSimon Glass { 222e7d35d2SSimon Glass memset(dms, '\0', sizeof(*dms)); 232e7d35d2SSimon Glass gd->dm_root = NULL; 242e7d35d2SSimon Glass memset(dm_testdrv_op_count, '\0', sizeof(dm_testdrv_op_count)); 252e7d35d2SSimon Glass 262e7d35d2SSimon Glass ut_assertok(dm_init()); 272e7d35d2SSimon Glass dms->root = dm_root(); 282e7d35d2SSimon Glass 292e7d35d2SSimon Glass return 0; 302e7d35d2SSimon Glass } 312e7d35d2SSimon Glass 322e7d35d2SSimon Glass /* Ensure all the test devices are probed */ 332e7d35d2SSimon Glass static int do_autoprobe(struct dm_test_state *dms) 342e7d35d2SSimon Glass { 3554c5d08aSHeiko Schocher struct udevice *dev; 362e7d35d2SSimon Glass int ret; 372e7d35d2SSimon Glass 382e7d35d2SSimon Glass /* Scanning the uclass is enough to probe all the devices */ 392e7d35d2SSimon Glass for (ret = uclass_first_device(UCLASS_TEST, &dev); 402e7d35d2SSimon Glass dev; 412e7d35d2SSimon Glass ret = uclass_next_device(&dev)) 422e7d35d2SSimon Glass ; 432e7d35d2SSimon Glass 442e7d35d2SSimon Glass return ret; 452e7d35d2SSimon Glass } 462e7d35d2SSimon Glass 472e7d35d2SSimon Glass static int dm_test_destroy(struct dm_test_state *dms) 482e7d35d2SSimon Glass { 492e7d35d2SSimon Glass int id; 502e7d35d2SSimon Glass 512e7d35d2SSimon Glass for (id = 0; id < UCLASS_COUNT; id++) { 522e7d35d2SSimon Glass struct uclass *uc; 532e7d35d2SSimon Glass 542e7d35d2SSimon Glass /* 552e7d35d2SSimon Glass * If the uclass doesn't exist we don't want to create it. So 562e7d35d2SSimon Glass * check that here before we call uclass_find_device()/ 572e7d35d2SSimon Glass */ 582e7d35d2SSimon Glass uc = uclass_find(id); 592e7d35d2SSimon Glass if (!uc) 602e7d35d2SSimon Glass continue; 612e7d35d2SSimon Glass ut_assertok(uclass_destroy(uc)); 622e7d35d2SSimon Glass } 632e7d35d2SSimon Glass 642e7d35d2SSimon Glass return 0; 652e7d35d2SSimon Glass } 662e7d35d2SSimon Glass 672e7d35d2SSimon Glass int dm_test_main(void) 682e7d35d2SSimon Glass { 692e7d35d2SSimon Glass struct dm_test *tests = ll_entry_start(struct dm_test, dm_test); 702e7d35d2SSimon Glass const int n_ents = ll_entry_count(struct dm_test, dm_test); 712e7d35d2SSimon Glass struct dm_test_state *dms = &global_test_state; 722e7d35d2SSimon Glass struct dm_test *test; 732e7d35d2SSimon Glass 742e7d35d2SSimon Glass /* 752e7d35d2SSimon Glass * If we have no device tree, or it only has a root node, then these 762e7d35d2SSimon Glass * tests clearly aren't going to work... 772e7d35d2SSimon Glass */ 782e7d35d2SSimon Glass if (!gd->fdt_blob || fdt_next_node(gd->fdt_blob, 0, NULL) < 0) { 792e7d35d2SSimon Glass puts("Please run with test device tree:\n" 802e7d35d2SSimon Glass " dtc -I dts -O dtb test/dm/test.dts -o test/dm/test.dtb\n" 812e7d35d2SSimon Glass " ./u-boot -d test/dm/test.dtb\n"); 822e7d35d2SSimon Glass ut_assert(gd->fdt_blob); 832e7d35d2SSimon Glass } 842e7d35d2SSimon Glass 852e7d35d2SSimon Glass printf("Running %d driver model tests\n", n_ents); 862e7d35d2SSimon Glass 872e7d35d2SSimon Glass for (test = tests; test < tests + n_ents; test++) { 882e7d35d2SSimon Glass printf("Test: %s\n", test->name); 892e7d35d2SSimon Glass ut_assertok(dm_test_init(dms)); 902e7d35d2SSimon Glass 912e7d35d2SSimon Glass if (test->flags & DM_TESTF_SCAN_PDATA) 92*00606d7eSSimon Glass ut_assertok(dm_scan_platdata(false)); 932e7d35d2SSimon Glass if (test->flags & DM_TESTF_PROBE_TEST) 942e7d35d2SSimon Glass ut_assertok(do_autoprobe(dms)); 952e7d35d2SSimon Glass if (test->flags & DM_TESTF_SCAN_FDT) 96*00606d7eSSimon Glass ut_assertok(dm_scan_fdt(gd->fdt_blob, false)); 972e7d35d2SSimon Glass 982e7d35d2SSimon Glass if (test->func(dms)) 992e7d35d2SSimon Glass break; 1002e7d35d2SSimon Glass 1012e7d35d2SSimon Glass ut_assertok(dm_test_destroy(dms)); 1022e7d35d2SSimon Glass } 1032e7d35d2SSimon Glass 1042e7d35d2SSimon Glass printf("Failures: %d\n", dms->fail_count); 1052e7d35d2SSimon Glass 1062e7d35d2SSimon Glass return 0; 1072e7d35d2SSimon Glass } 108