Re: [PATCH] sh: add support for linking a builtin device tree blob in the kernel
From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2016-03-26 09:01:43
Also in:
linux-sh
CC devicetree On Sat, Mar 26, 2016 at 2:47 AM, Rich Felker [off-list ref] wrote:
Signed-off-by: Rich Felker <dalias@libc.org> --- I'd like to add this patch to the new device tree support to ease the transition to device tree on legacy hardware where replacing the bootloader with a new one that can pass a DTB may be extra work. Since I'm not familiar with this kind of build system change, though, I'd like some feedback on whether I'm doing it right.
Alternatively, you could append the DTB to the boot image. Cfr. http://elinux.org/R-Car/Boards/Marzen http://elinux.org/Dragonboard/APQ8074
quoted hunk
arch/sh/Kconfig | 20 ++++++++++++++++++++ arch/sh/Makefile | 2 ++ arch/sh/boards/of-generic.c | 15 ++++++++++++--- arch/sh/boot/dts/Makefile | 3 +++ arch/sh/kernel/setup.c | 4 ++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 arch/sh/boot/dts/Makefilediff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 9dec535..b6db094 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig@@ -755,6 +755,26 @@ endmenu menu "Boot options" +config USE_BUILTIN_DTB + bool "Use builtin DTB" + default n + depends on SH_DEVICE_TREE + help + Link a device tree blob for particular hardware into the kernel, + suppressing use of the DTB pointer provided by the bootloader. + This option should only be used with legacy bootloaders that are + not capable of providing a DTB to the kernel, or for experimental + hardware without stable device tree bindings. + +config BUILTIN_DTB_SOURCE + string "Source file for builtin DTB" + default "" + depends on USE_BUILTIN_DTB + help + Base name (without suffix, relative to arch/sh/boot/dts) for the + a DTS file that will be used to produce the DTB linked into the
drop the first word "a"
quoted hunk
+ kernel. + config ZERO_PAGE_OFFSET hex default "0x00010000" if PAGE_SIZE_64KB || SH_RTS7751R2D || \diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 3566a759..0047666 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile@@ -131,6 +131,8 @@ head-y := arch/sh/kernel/head_$(BITS).o core-y += arch/sh/kernel/ arch/sh/mm/ arch/sh/boards/ core-$(CONFIG_SH_FPU_EMU) += arch/sh/math-emu/ +core-$(CONFIG_USE_BUILTIN_DTB) += arch/sh/boot/dts/ + # Mach groups machdir-$(CONFIG_SOLUTION_ENGINE) += mach-se machdir-$(CONFIG_SH_HP6XX) += mach-hp6xxdiff --git a/arch/sh/boards/of-generic.c b/arch/sh/boards/of-generic.c index bf3a166..57d45dc 100644 --- a/arch/sh/boards/of-generic.c +++ b/arch/sh/boards/of-generic.c@@ -126,13 +126,22 @@ static void __init sh_of_time_init(void) static void __init sh_of_setup(char **cmdline_p) { + struct device_node *root; + +#ifdef CONFIG_USE_BUILTIN_DTB + unflatten_and_copy_device_tree(); +#else unflatten_device_tree(); +#endif board_time_init = sh_of_time_init; - sh_mv.mv_name = of_flat_dt_get_machine_name(); - if (!sh_mv.mv_name) - sh_mv.mv_name = "Unknown SH model"; + sh_mv.mv_name = "Unknown SH model"; + root = of_find_node_by_path("/"); + if (root) { + of_property_read_string(root, "model", &sh_mv.mv_name); + of_node_put(root); + } sh_of_smp_probe(); }diff --git a/arch/sh/boot/dts/Makefile b/arch/sh/boot/dts/Makefile new file mode 100644 index 0000000..e5ce3a0 --- /dev/null +++ b/arch/sh/boot/dts/Makefile@@ -0,0 +1,3 @@ +obj-$(CONFIG_USE_BUILTIN_DTB) += $(patsubst "%",%,$(CONFIG_BUILTIN_DTB_SOURCE)).dtb.o + +clean-files := *.dtb.Sdiff --git a/arch/sh/kernel/setup.c b/arch/sh/kernel/setup.c index efb60ce..ec7c99f 100644 --- a/arch/sh/kernel/setup.c +++ b/arch/sh/kernel/setup.c@@ -251,7 +251,11 @@ void __ref sh_fdt_init(phys_addr_t dt_phys) /* Avoid calling an __init function on secondary cpus. */ if (done) return; +#ifdef CONFIG_USE_BUILTIN_DTB + dt_virt = __dtb_start; +#else dt_virt = phys_to_virt(dt_phys); +#endif if (!dt_virt || !early_init_dt_scan(dt_virt)) { pr_crit("Error: invalid device tree blob"
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds