um: Add devicetree support
authorVincent Whitchurch <vincent.whitchurch@axis.com>
Wed, 8 Dec 2021 15:11:23 +0000 (16:11 +0100)
committerRichard Weinberger <richard@nod.at>
Wed, 22 Dec 2021 19:35:01 +0000 (20:35 +0100)
Add a dtb=<filename> option to boot UML with a devicetree blob.  This
can be used for testing driver code using UML.

Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
[rw: Add dependency on CONFIG_OF]
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/Kconfig
arch/um/kernel/Makefile
arch/um/kernel/dtb.c [new file with mode: 0644]
arch/um/kernel/um_arch.c
arch/um/kernel/um_arch.h

index aafdbb6..b233db4 100644 (file)
@@ -18,6 +18,7 @@ config UML
        select HAVE_DEBUG_KMEMLEAK
        select HAVE_DEBUG_BUGVERBOSE
        select NO_DMA if !UML_DMA_EMULATION
+       select OF_EARLY_FLATTREE if OF
        select GENERIC_IRQ_SHOW
        select GENERIC_CPU_DEVICES
        select HAVE_GCC_PLUGINS
index 4ab4a00..1c2d4b2 100644 (file)
@@ -22,6 +22,7 @@ obj-y += load_file.o
 
 obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
 obj-$(CONFIG_GPROF)    += gprof_syms.o
+obj-$(CONFIG_OF) += dtb.o
 obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
 obj-$(CONFIG_STACKTRACE) += stacktrace.o
 obj-$(CONFIG_GENERIC_PCI_IOMAP) += ioport.o
diff --git a/arch/um/kernel/dtb.c b/arch/um/kernel/dtb.c
new file mode 100644 (file)
index 0000000..ca69d72
--- /dev/null
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/init.h>
+#include <linux/of_fdt.h>
+#include <linux/printk.h>
+#include <linux/memblock.h>
+#include <init.h>
+
+#include "um_arch.h"
+
+static char *dtb __initdata;
+
+void uml_dtb_init(void)
+{
+       long long size;
+       void *area;
+
+       area = uml_load_file(dtb, &size);
+       if (!area)
+               return;
+
+       if (!early_init_dt_scan(area)) {
+               pr_err("invalid DTB %s\n", dtb);
+               memblock_free(area, size);
+               return;
+       }
+
+       unflatten_device_tree();
+       early_init_fdt_scan_reserved_mem();
+}
+
+static int __init uml_dtb_setup(char *line, int *add)
+{
+       dtb = line;
+       return 0;
+}
+
+__uml_setup("dtb=", uml_dtb_setup,
+"dtb=<file>\n"
+"    Boot the kernel with the devicetree blob from the specified file.\n"
+);
index 5444769..abceeab 100644 (file)
@@ -29,6 +29,8 @@
 #include <mem_user.h>
 #include <os.h>
 
+#include "um_arch.h"
+
 #define DEFAULT_COMMAND_LINE_ROOT "root=98:0"
 #define DEFAULT_COMMAND_LINE_CONSOLE "console=tty"
 
@@ -407,6 +409,7 @@ void __init setup_arch(char **cmdline_p)
        stack_protections((unsigned long) &init_thread_info);
        setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem);
        mem_total_pages(physmem_size, iomem_size, highmem);
+       uml_dtb_init();
        read_initrd();
 
        paging_init();
index b195df3..1e07fb7 100644 (file)
@@ -5,4 +5,10 @@
 
 extern void * __init uml_load_file(const char *filename, unsigned long long *size);
 
+#ifdef CONFIG_OF
+extern void __init uml_dtb_init(void);
+#else
+static inline void uml_dtb_init(void) { }
+#endif
+
 #endif