diff --git a/include/dm/test.h b/include/dm/test.h
index cba504909acae50f337989c0ab2743952f86050a..cecee26f3364ca89c58f5f59b91c9a902683cc5d 100644
--- a/include/dm/test.h
+++ b/include/dm/test.h
@@ -150,6 +150,8 @@ enum {
 	DM_TESTF_SCAN_PDATA	= 1 << 0,	/* test needs platform data */
 	DM_TESTF_PROBE_TEST	= 1 << 1,	/* probe test uclass */
 	DM_TESTF_SCAN_FDT	= 1 << 2,	/* scan device tree */
+	DM_TESTF_FLAT_TREE	= 1 << 3,	/* test needs flat DT */
+	DM_TESTF_LIVE_TREE	= 1 << 4,	/* needs live device tree */
 };
 
 /* Declare a new driver model test */
diff --git a/include/test/test.h b/include/test/test.h
index e3e821c6ea8a9a2183ba9f100aae643af9d8ed65..646dbfd486459bd5558407ed74e21305bbe842a9 100644
--- a/include/test/test.h
+++ b/include/test/test.h
@@ -15,11 +15,13 @@
  * @fail_count: Number of tests that failed
  * @start: Store the starting mallinfo when doing leak test
  * @priv: A pointer to some other info some suites want to track
+ * @of_root: Record of the livetree root node (used for setting up tests)
  */
 struct unit_test_state {
 	int fail_count;
 	struct mallinfo start;
 	void *priv;
+	struct device_node *of_root;
 };
 
 /**
diff --git a/test/dm/test-main.c b/test/dm/test-main.c
index 88ef267458e57d556a32fa56114ae2f73cfdeecf..9d88d31467c464aeeba542b8e71a378399ee0498 100644
--- a/test/dm/test-main.c
+++ b/test/dm/test-main.c
@@ -110,6 +110,21 @@ static int dm_do_test(struct unit_test_state *uts, struct unit_test *test,
 	return 0;
 }
 
+/**
+ * dm_test_run_on_flattree() - Check if we should run a test with flat DT
+ *
+ * This skips long/slow tests where there is not much value in running a flat
+ * DT test in addition to a live DT test.
+ *
+ * @return true to run the given test on the flat device tree
+ */
+static bool dm_test_run_on_flattree(struct unit_test *test)
+{
+	const char *fname = strrchr(test->file, '/') + 1;
+
+	return !strstr(fname, "video") || strstr(test->name, "video_base");
+}
+
 static int dm_test_main(const char *test_name)
 {
 	struct unit_test *tests = ll_entry_start(struct unit_test, dm_test);
@@ -140,14 +155,33 @@ static int dm_test_main(const char *test_name)
 #endif
 	for (test = tests; test < tests + n_ents; test++) {
 		const char *name = test->name;
+		int runs;
 
 		/* All tests have this prefix */
 		if (!strncmp(name, "dm_test_", 8))
 			name += 8;
 		if (test_name && strcmp(test_name, name))
 			continue;
-		ut_assertok(dm_do_test(uts, test, false));
-		run_count++;
+
+		/* Run with the live tree if possible */
+		runs = 0;
+		if (IS_ENABLED(CONFIG_OF_LIVE)) {
+			if (!(test->flags & DM_TESTF_FLAT_TREE)) {
+				ut_assertok(dm_do_test(uts, test, true));
+				runs++;
+			}
+		}
+
+		/*
+		 * Run with the flat tree if we couldn't run it with live tree,
+		 * or it is a core test.
+		 */
+		if (!(test->flags & DM_TESTF_LIVE_TREE) &&
+		    (!runs || dm_test_run_on_flattree(test))) {
+			ut_assertok(dm_do_test(uts, test, false));
+			runs++;
+		}
+		run_count += runs;
 	}
 
 	if (test_name && !run_count)