summaryrefslogtreecommitdiff
path: root/arch/um/kernel/dtb.c
diff options
context:
space:
mode:
authorVincent Whitchurch <vincent.whitchurch@axis.com>2021-12-08 16:11:23 +0100
committerRichard Weinberger <richard@nod.at>2021-12-22 20:35:01 +0100
commitb31297f04e86e4115ece79ca530d8ae1c454db75 (patch)
tree0de0a845d29525262d48d3b81c829a855806ff23 /arch/um/kernel/dtb.c
parent361640b4fdc86167b0c25d8e73c08dcaa4ecd28a (diff)
downloadlinux-b31297f04e86e4115ece79ca530d8ae1c454db75.tar.gz
linux-b31297f04e86e4115ece79ca530d8ae1c454db75.tar.bz2
linux-b31297f04e86e4115ece79ca530d8ae1c454db75.zip
um: Add devicetree support
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>
Diffstat (limited to 'arch/um/kernel/dtb.c')
-rw-r--r--arch/um/kernel/dtb.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/arch/um/kernel/dtb.c b/arch/um/kernel/dtb.c
new file mode 100644
index 000000000000..ca69d72025f3
--- /dev/null
+++ b/arch/um/kernel/dtb.c
@@ -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"
+);