Explorar o código

MIPS: vmlinux: create a section for appended DTB

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>
Aaro Koskinen %!s(int64=10) %!d(string=hai) anos
pai
achega
87db537da4
Modificáronse 3 ficheiros con 23 adicións e 0 borrados
  1. 14 0
      arch/mips/Kconfig
  2. 4 0
      arch/mips/kernel/setup.c
  3. 5 0
      arch/mips/kernel/vmlinux.lds.S

+ 14 - 0
arch/mips/Kconfig

@@ -2736,6 +2736,20 @@ choice
 		help
 		help
 		  Do not enable appended dtb support.
 		  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
 	config MIPS_RAW_APPENDED_DTB
 		bool "vmlinux.bin"
 		bool "vmlinux.bin"
 		help
 		help

+ 4 - 0
arch/mips/kernel/setup.c

@@ -39,6 +39,10 @@
 #include <asm/smp-ops.h>
 #include <asm/smp-ops.h>
 #include <asm/prom.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;
 struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
 
 
 EXPORT_SYMBOL(cpu_data);
 EXPORT_SYMBOL(cpu_data);

+ 5 - 0
arch/mips/kernel/vmlinux.lds.S

@@ -132,6 +132,11 @@ SECTIONS
 	__appended_dtb = .;
 	__appended_dtb = .;
 	/* leave space for appended DTB */
 	/* leave space for appended DTB */
 	. += 0x100000;
 	. += 0x100000;
+#elif defined(CONFIG_MIPS_ELF_APPENDED_DTB)
+	.appended_dtb : AT(ADDR(.appended_dtb) - LOAD_OFFSET) {
+		*(.appended_dtb)
+		KEEP(*(.appended_dtb))
+	}
 #endif
 #endif
 	/*
 	/*
 	 * Align to 64K in attempt to eliminate holes before the
 	 * Align to 64K in attempt to eliminate holes before the