MIPS: vmlinux: create a section for appended DTB
authorAaro Koskinen <aaro.koskinen@nokia.com>
Fri, 11 Sep 2015 14:46:14 +0000 (17:46 +0300)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 12 Nov 2015 10:35:48 +0000 (11:35 +0100)
For bootloaders that support booting only ELF kernels and load only ELF
segments to memory there is no easy way to supply DTB without kernel
recompilation. For that purpose, create a section called .appended_dtb
that can be later updated with board-specific DTB using binutils e.g. at
kernel installation time.

Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/11114/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/Kconfig
arch/mips/kernel/setup.c
arch/mips/kernel/vmlinux.lds.S

index 218aa67a2c52bb5fe37b7ee3b1b15e60208d0f89..71683a8533723866872de04f7194d07a28f33045 100644 (file)
@@ -2736,6 +2736,20 @@ choice
                help
                  Do not enable appended dtb support.
 
+       config MIPS_ELF_APPENDED_DTB
+               bool "vmlinux"
+               help
+                 With this option, the boot code will look for a device tree binary
+                 DTB) included in the vmlinux ELF section .appended_dtb. By default
+                 it is empty and the DTB can be appended using binutils command
+                 objcopy:
+
+                   objcopy --update-section .appended_dtb=<filename>.dtb vmlinux
+
+                 This is meant as a backward compatiblity convenience for those
+                 systems with a bootloader that can't be upgraded to accommodate
+                 the documented boot protocol using a device tree.
+
        config MIPS_RAW_APPENDED_DTB
                bool "vmlinux.bin"
                help
index 6f142ee4a086368271a8ace55a1d487d95394fd1..66aac55df3497f79d39f1b203601eccf3a25a48f 100644 (file)
 #include <asm/smp-ops.h>
 #include <asm/prom.h>
 
+#ifdef CONFIG_MIPS_ELF_APPENDED_DTB
+const char __section(.appended_dtb) __appended_dtb[0x100000];
+#endif /* CONFIG_MIPS_ELF_APPENDED_DTB */
+
 struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
 
 EXPORT_SYMBOL(cpu_data);
index 07d32a4aea60e418892ffb27cbae05c11099a92f..f4c23d9023be1f7acfadbba66bf9b05a079a60b8 100644 (file)
@@ -132,6 +132,11 @@ SECTIONS
        __appended_dtb = .;
        /* leave space for appended DTB */
        . += 0x100000;
+#elif defined(CONFIG_MIPS_ELF_APPENDED_DTB)
+       .appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
+               *(.appended_dtb)
+               KEEP(*(.appended_dtb))
+       }
 #endif
        /*
         * Align to 64K in attempt to eliminate holes before the