Quoting Geert Uytterhoeven (2024-02-05 11:55:29)
On Mon, Feb 5, 2024 at 8:19 PM Stephen Boyd sboyd@kernel.org wrote:
Quoting David Gow (2024-02-02 20:10:17)
On Sat, 3 Feb 2024 at 03:59, Stephen Boyd sboyd@kernel.org wrote:
Add a KUnit test that confirms a DTB has been loaded, i.e. there is a root node, and that the of_have_populated_dt() API works properly.
Cc: Rob Herring robh+dt@kernel.org Cc: Frank Rowand frowand.list@gmail.com Cc: David Gow davidgow@google.com Cc: Brendan Higgins brendan.higgins@linux.dev Signed-off-by: Stephen Boyd sboyd@kernel.org
This looks pretty good to me test-wise, though it still fails on m68k. (Everything else I tried it on works, though I've definitely not tried _every_ architecture.)
aarch64: PASSED i386: PASSED x86_64: PASSED x86_64 KASAN: PASSED powerpc64: PASSED UML: PASSED UML LLVM: PASSED m68k: FAILED
$ qemu-system-m68k -nodefaults -m 1024 -kernel .kunit-all-m68k/vmlinux -append 'kunit.enable=1 console=hvc0 kunit_shutdown=reboot' -no-reboot -nographic -serial stdio -machine virt [11:55:05] ===================== dtb (2 subtests) ===================== [11:55:05] # dtb_root_node_found_by_path: EXPECTATION FAILED at drivers/of/of_test.c:18 [11:55:05] Expected np is not null, but is [11:55:05] [FAILED] dtb_root_node_found_by_path [11:55:05] # dtb_root_node_populates_of_root: EXPECTATION FAILED at drivers/of/of_test.c:28 [11:55:05] Expected of_root is not null, but is [11:55:05] [FAILED] dtb_root_node_populates_of_root [11:55:05] # module: of_test [11:55:05] # dtb: pass:0 fail:2 skip:0 total:2 [11:55:05] # Totals: pass:0 fail:2 skip:0 total:2 [11:55:05] ======================= [FAILED] dtb =======================
Ah yeah I forgot to mention that. m68k fails because it doesn't call the unflatten_(and_copy)?_device_tree() function, so we don't populate a root node on that architecture. One solution would be to make CONFIG_OF unavailable on m68k. Or we have to make sure DT works on any architecture. Rob, what do you prefer here?
I guess the latter? Alpha, hexagon, parisc, s390, and sparc are also lacking calls to unflatten.*device_tree().
sparc does that on purpose. Perhaps it's simplest to call unflatten_device_tree() if of_root is still NULL after setup_arch() returns.
---8<--- diff --git a/init/main.c b/init/main.c index e24b0780fdff..02f5cf8be6c1 100644 --- a/init/main.c +++ b/init/main.c @@ -97,6 +97,8 @@ #include <linux/jump_label.h> #include <linux/kcsan.h> #include <linux/init_syscalls.h> +#include <linux/of.h> +#include <linux/of_fdt.h> #include <linux/stackdepot.h> #include <linux/randomize_kstack.h> #include <net/net_namespace.h> @@ -895,6 +897,8 @@ void start_kernel(void) pr_notice("%s", linux_banner); early_security_init(); setup_arch(&command_line); + if (!of_root) + unflatten_device_tree(); setup_boot_config(); setup_command_line(command_line); setup_nr_cpu_ids();