diff options
Diffstat (limited to 'target/linux/generic/patches-4.4/092-MIPS-ZBOOT-copy-appended-dtb-to-the-end-of-the-kerne.patch')
-rw-r--r-- | target/linux/generic/patches-4.4/092-MIPS-ZBOOT-copy-appended-dtb-to-the-end-of-the-kerne.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/target/linux/generic/patches-4.4/092-MIPS-ZBOOT-copy-appended-dtb-to-the-end-of-the-kerne.patch b/target/linux/generic/patches-4.4/092-MIPS-ZBOOT-copy-appended-dtb-to-the-end-of-the-kerne.patch new file mode 100644 index 0000000..71df429 --- /dev/null +++ b/target/linux/generic/patches-4.4/092-MIPS-ZBOOT-copy-appended-dtb-to-the-end-of-the-kerne.patch @@ -0,0 +1,132 @@ +From b8f54f2cde788623f41d11327688c75aed34092f Mon Sep 17 00:00:00 2001 +From: Jonas Gorski <jogo@openwrt.org> +Date: Mon, 20 Jun 2016 11:27:36 +0200 +Subject: [PATCH 1/2] MIPS: ZBOOT: copy appended dtb to the end of the kernel + +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 | 22 ++-------------------- + arch/mips/boot/compressed/decompress.c | 17 +++++++++++++++++ + arch/mips/boot/compressed/head.S | 16 ---------------- + 3 files changed, 19 insertions(+), 36 deletions(-) + +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -2752,10 +2752,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 +@@ -2767,24 +2767,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 +--- a/arch/mips/boot/compressed/decompress.c ++++ b/arch/mips/boot/compressed/decompress.c +@@ -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 va + #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 boo + __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"); + } +--- a/arch/mips/boot/compressed/head.S ++++ b/arch/mips/boot/compressed/head.S +@@ -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 |