blob: 826b64565e837e2a66604cabfb86f8e2fa3a5366 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Simon Glass2e7d35d2014-02-26 15:59:21 -07002/*
3 * Copyright (c) 2013 Google, Inc
Simon Glass2e7d35d2014-02-26 15:59:21 -07004 */
5
6#include <common.h>
Joe Hershberger40441e02015-05-20 14:27:29 -05007#include <command.h>
Simon Glass24b852a2015-11-08 23:47:45 -07008#include <console.h>
Simon Glass2e7d35d2014-02-26 15:59:21 -07009#include <dm.h>
10#include <errno.h>
Simon Glassf7ae49f2020-05-10 11:40:05 -060011#include <log.h>
Simon Glass756ac0b2014-10-04 11:29:50 -060012#include <malloc.h>
Simon Glass401d1c42020-10-30 21:38:53 -060013#include <asm/global_data.h>
Simon Glass3884c982015-11-08 23:47:44 -070014#include <asm/state.h>
Simon Glass2e7d35d2014-02-26 15:59:21 -070015#include <dm/root.h>
16#include <dm/uclass-internal.h>
Simon Glass0e1fad42020-07-19 10:15:37 -060017#include <test/test.h>
18#include <test/test.h>
Joe Hershbergere721b882015-05-20 14:27:27 -050019#include <test/ut.h>
Simon Glass2e7d35d2014-02-26 15:59:21 -070020
21DECLARE_GLOBAL_DATA_PTR;
22
Joe Hershbergere721b882015-05-20 14:27:27 -050023struct unit_test_state global_dm_test_state;
Simon Glass2e7d35d2014-02-26 15:59:21 -070024
Simon Glass8a38abf2020-10-03 11:31:40 -060025static bool test_matches(const char *test_name, const char *find_name)
26{
27 if (!find_name)
28 return true;
29
30 if (!strcmp(test_name, find_name))
31 return true;
32
33 /* All tests have this prefix */
34 if (!strncmp(test_name, "dm_test_", 8))
35 test_name += 8;
36
37 if (!strcmp(test_name, find_name))
38 return true;
39
40 return false;
41}
42
Simon Glass409f4a22021-03-07 17:34:46 -070043int dm_test_run(const char *test_name)
Simon Glass2e7d35d2014-02-26 15:59:21 -070044{
Joe Hershbergere721b882015-05-20 14:27:27 -050045 struct unit_test *tests = ll_entry_start(struct unit_test, dm_test);
46 const int n_ents = ll_entry_count(struct unit_test, dm_test);
47 struct unit_test_state *uts = &global_dm_test_state;
Joe Hershbergere721b882015-05-20 14:27:27 -050048 struct unit_test *test;
Simon Glassad950472019-09-25 08:55:52 -060049 int found;
Simon Glass2e7d35d2014-02-26 15:59:21 -070050
Stephen Warren26e1bec2016-01-27 23:57:46 -070051 uts->fail_count = 0;
52
Simon Glass5b448ce2020-10-25 20:38:27 -060053 if (!CONFIG_IS_ENABLED(OF_PLATDATA)) {
54 /*
55 * If we have no device tree, or it only has a root node, then
56 * these * tests clearly aren't going to work...
57 */
58 if (!gd->fdt_blob || fdt_next_node(gd->fdt_blob, 0, NULL) < 0) {
59 puts("Please run with test device tree:\n"
60 " ./u-boot -d arch/sandbox/dts/test.dtb\n");
61 ut_assert(gd->fdt_blob);
62 }
Simon Glass2e7d35d2014-02-26 15:59:21 -070063 }
64
Simon Glass57f54d52015-03-25 12:23:04 -060065 if (!test_name)
66 printf("Running %d driver model tests\n", n_ents);
Simon Glass8a38abf2020-10-03 11:31:40 -060067 else
Simon Glass2e7d35d2014-02-26 15:59:21 -070068
Simon Glassad950472019-09-25 08:55:52 -060069 found = 0;
Simon Glassa652d9c2020-10-03 09:25:22 -060070 uts->of_root = gd_of_root();
Simon Glass2e7d35d2014-02-26 15:59:21 -070071 for (test = tests; test < tests + n_ents; test++) {
Simon Glassc02790c2015-07-06 12:54:23 -060072 const char *name = test->name;
73
Simon Glass8a38abf2020-10-03 11:31:40 -060074 if (!test_matches(name, test_name))
Simon Glass57f54d52015-03-25 12:23:04 -060075 continue;
Simon Glass6fb2f572017-05-18 20:09:17 -060076
Simon Glassd2281bb2021-03-07 17:35:03 -070077 ut_assertok(ut_run_test_live_flat(uts, test, test->name));
Simon Glassad950472019-09-25 08:55:52 -060078 found++;
Simon Glass2e7d35d2014-02-26 15:59:21 -070079 }
80
Simon Glassad950472019-09-25 08:55:52 -060081 if (test_name && !found)
Simon Glassc02790c2015-07-06 12:54:23 -060082 printf("Test '%s' not found\n", test_name);
83 else
84 printf("Failures: %d\n", uts->fail_count);
Simon Glass2e7d35d2014-02-26 15:59:21 -070085
Simon Glassfe9a9672019-09-25 08:55:51 -060086 /* Put everything back to normal so that sandbox works as expected */
Simon Glassa652d9c2020-10-03 09:25:22 -060087 gd_set_of_root(uts->of_root);
Joe Hershbergerb6227d32015-05-20 14:27:35 -050088 gd->dm_root = NULL;
Simon Glassa652d9c2020-10-03 09:25:22 -060089 ut_assertok(dm_init(CONFIG_IS_ENABLED(OF_LIVE)));
Simon Glass8a8d24b2020-12-03 16:55:23 -070090 dm_scan_plat(false);
Simon Glass5b448ce2020-10-25 20:38:27 -060091 if (!CONFIG_IS_ENABLED(OF_PLATDATA))
Simon Glass725e4fc2020-11-28 17:50:09 -070092 dm_scan_fdt(false);
Joe Hershbergerb6227d32015-05-20 14:27:35 -050093
Joe Hershberger7cccc662015-05-20 14:27:32 -050094 return uts->fail_count ? CMD_RET_FAILURE : 0;
Simon Glass2e7d35d2014-02-26 15:59:21 -070095}
Joe Hershberger40441e02015-05-20 14:27:29 -050096
Simon Glass09140112020-05-10 11:40:03 -060097int do_ut_dm(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
Joe Hershberger40441e02015-05-20 14:27:29 -050098{
99 const char *test_name = NULL;
100
101 if (argc > 1)
102 test_name = argv[1];
103
Simon Glass409f4a22021-03-07 17:34:46 -0700104 return dm_test_run(test_name);
Joe Hershberger40441e02015-05-20 14:27:29 -0500105}