MIPS: ZBOOT: copy appended dtb to the end of the kernel
authorJonas Gorski <jogo@openwrt.org>
Mon, 20 Jun 2016 09:27:36 +0000 (11:27 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 2 Aug 2016 12:00:16 +0000 (14:00 +0200)
Instead of rewriting the arguments, just move the appended dtb to where
the decompressed kernel expects it. This eliminates the need for special
casing vmlinuz.bin appended dtb files.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
Cc: Kevin Cernekee <cernekee@gmail.com>
Cc: Florian Fainelli <f.fainelli@gmail.com>
Cc: John Crispin <john@phrozen.org>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: James Hogan <james.hogan@imgtec.com>
Cc: Alban Bedel <albeu@free.fr>
Cc: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
Cc: Antony Pavlov <antonynpavlov@gmail.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13698/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/Kconfig
arch/mips/boot/compressed/decompress.c
arch/mips/boot/compressed/head.S

index 3953bb1..b0b0a4d 100644 (file)
@@ -2884,10 +2884,10 @@ choice
                  the documented boot protocol using a device tree.
 
        config MIPS_RAW_APPENDED_DTB
-               bool "vmlinux.bin"
+               bool "vmlinux.bin or vmlinuz.bin"
                help
                  With this option, the boot code will look for a device tree binary
-                 DTB) appended to raw vmlinux.bin (without decompressor).
+                 DTB) appended to raw vmlinux.bin or vmlinuz.bin.
                  (e.g. cat vmlinux.bin <filename>.dtb > vmlinux_w_dtb).
 
                  This is meant as a backward compatibility convenience for those
@@ -2899,24 +2899,6 @@ choice
                  look like a DTB header after a reboot if no actual DTB is appended
                  to vmlinux.bin.  Do not leave this option active in a production kernel
                  if you don't intend to always append a DTB.
-
-       config MIPS_ZBOOT_APPENDED_DTB
-               bool "vmlinuz.bin"
-               depends on SYS_SUPPORTS_ZBOOT
-               help
-                 With this option, the boot code will look for a device tree binary
-                 DTB) appended to raw vmlinuz.bin (with decompressor).
-                 (e.g. cat vmlinuz.bin <filename>.dtb > vmlinuz_w_dtb).
-
-                 This is meant as a backward compatibility convenience for those
-                 systems with a bootloader that can't be upgraded to accommodate
-                 the documented boot protocol using a device tree.
-
-                 Beware that there is very little in terms of protection against
-                 this option being confused by leftover garbage in memory that might
-                 look like a DTB header after a reboot if no actual DTB is appended
-                 to vmlinuz.bin.  Do not leave this option active in a production kernel
-                 if you don't intend to always append a DTB.
 endchoice
 
 choice
index 080cd53..fdf99e9 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
+#include <linux/libfdt.h>
 
 #include <asm/addrspace.h>
 
@@ -36,6 +37,8 @@ extern void puthex(unsigned long long val);
 #define puthex(val) do {} while (0)
 #endif
 
+extern char __appended_dtb[];
+
 void error(char *x)
 {
        puts("\n\n");
@@ -114,6 +117,20 @@ void decompress_kernel(unsigned long boot_heap_start)
        __decompress((char *)zimage_start, zimage_size, 0, 0,
                   (void *)VMLINUX_LOAD_ADDRESS_ULL, 0, 0, error);
 
+       if (IS_ENABLED(CONFIG_MIPS_RAW_APPENDED_DTB) &&
+           fdt_magic((void *)&__appended_dtb) == FDT_MAGIC) {
+               unsigned int image_size, dtb_size;
+
+               dtb_size = fdt_totalsize((void *)&__appended_dtb);
+
+               /* last four bytes is always image size in little endian */
+               image_size = le32_to_cpup((void *)&__image_end - 4);
+
+               /* copy dtb to where the booted kernel will expect it */
+               memcpy((void *)VMLINUX_LOAD_ADDRESS_ULL + image_size,
+                      __appended_dtb, dtb_size);
+       }
+
        /* FIXME: should we flush cache here? */
        puts("Now, booting the kernel...\n");
 }
index c580e85..409cb48 100644 (file)
@@ -25,22 +25,6 @@ start:
        move    s2, a2
        move    s3, a3
 
-#ifdef CONFIG_MIPS_ZBOOT_APPENDED_DTB
-       PTR_LA  t0, __appended_dtb
-#ifdef CONFIG_CPU_BIG_ENDIAN
-       li      t1, 0xd00dfeed
-#else
-       li      t1, 0xedfe0dd0
-#endif
-       lw      t2, (t0)
-       bne     t1, t2, not_found
-        nop
-
-       move    s1, t0
-       PTR_LI  s0, -2
-not_found:
-#endif
-
        /* Clear BSS */
        PTR_LA  a0, _edata
        PTR_LA  a2, _end