]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Prepare for updating the device tree with ofnode
authorSimon Glass <sjg@chromium.org>
Sat, 30 Jul 2022 21:52:12 +0000 (15:52 -0600)
committerTom Rini <trini@konsulko.com>
Fri, 12 Aug 2022 12:14:24 +0000 (08:14 -0400)
Add some documentation and a new flag so that we can safely enabled using
the ofnode interface to write to the device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
doc/develop/driver-model/livetree.rst
include/test/test.h
test/test-main.c

index c29f29b205b379f082d4728fffd0f6adc8b82490..faf3eb5b5f0e5a9f7e2a61e48e982596176c149a 100644 (file)
@@ -224,6 +224,32 @@ support is provided for adding those) that indicates that they should be
 freed. Then the tree can be scanned for these 'separately allocated' nodes and
 properties before freeing the memory block.
 
+The ofnode_write\_...() functions also support writing to the flat tree. Care
+should be taken however, since this can change the position of node names and
+properties in the flat tree, thus affecting the live tree. Generally this does
+not matter, since when we fire up the live tree we don't ever use the flat tree
+again. But in the case of tests, this can cause a problem.
+
+The sandbox tests typically run with OF_LIVE enabled but with the actual live
+tree either present or absent. This is to make sure that the flat tree functions
+work correctly even with OF_LIVE is enabled. But if a test modifies the flat
+device tree, then the live tree can become invalid. Any live tree tests that run
+after that point will use a corrupted tree, e.g. with an incorrect property name
+or worse. To deal with this we use a flag UT_TESTF_LIVE_OR_FLAT then ensures
+that tests which write to the flat tree are not run if OF_LIVE is enabled. Only
+the live tree version of the test is run, when OF_LIVE is enabled, with
+sandbox_flattree running the flat tree version.
+
+This is of course a work-around, even if a reasonable one. One solution to this
+problem would be to make a copy of the flat tree before the test and restore it
+afterwards, in the same memory location, so that the live tree pointers work
+again. Another would be to regenerate the live tree if a test modified the flat
+tree.
+
+Neither of these solutions is currently implemented, since the situation that
+causes the problem can only occur in sandbox tests, is somewhat esoteric and
+the UT_TESTF_LIVE_OR_FLAT flag deals with it in a reasonable way.
+
 
 Multiple livetrees
 ------------------
index 0104e189f63d59456094fff975075fb0ce6a2e2e..c888d68b1ed7240dde67a09f0424f8d1dfa5c838 100644 (file)
@@ -46,6 +46,8 @@ enum {
        UT_TESTF_CONSOLE_REC    = BIT(5),       /* needs console recording */
        /* do extra driver model init and uninit */
        UT_TESTF_DM             = BIT(6),
+       /* live or flat device tree, but not both in the same executable */
+       UT_TESTF_LIVE_OR_FLAT   = BIT(4),
 };
 
 /**
index ee38d1faea8ded036c8afa66fbd3af947e70f0eb..c0d0378c5d818c3126a3a47c50a7895b1b150d55 100644 (file)
@@ -338,7 +338,8 @@ static int ut_run_test_live_flat(struct unit_test_state *uts,
        /* Run with the live tree if possible */
        runs = 0;
        if (CONFIG_IS_ENABLED(OF_LIVE)) {
-               if (!(test->flags & UT_TESTF_FLAT_TREE)) {
+               if (!(test->flags &
+                   (UT_TESTF_FLAT_TREE | UT_TESTF_LIVE_OR_FLAT))) {
                        uts->of_live = true;
                        ut_assertok(ut_run_test(uts, test, test->name));
                        runs++;