Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8f54f2c authored by Jonas Gorski's avatar Jonas Gorski Committed by Ralf Baechle
Browse files

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: default avatarJonas 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: default avatarRalf Baechle <ralf@linux-mips.org>
parent 79977894
Loading
Loading
Loading
Loading
+2 −20
Original line number Diff line number Diff line
@@ -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
+17 −0
Original line number Diff line number Diff line
@@ -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");
}
+0 −16
Original line number Diff line number Diff line
@@ -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